簡體   English   中英

PHP:不在 foreach 內循環

[英]PHP: not looping inside a foreach

我有這個數組:

$flavours = array (
    0 => array(799390 => 'Banana',),
    1 => array(799391 => 'Chocolate',)
);

現在我在一個 foreach 中循環我的數據庫中的一個集合。 我從數據庫中得到 'Banana' ,我需要數組給我799390

我努力了:

‌‌array_search('Banana', $flavours); 

但除非我添加,否則它不起作用:

‌‌array_search('Banana', $flavours[0]); 

但我無法添加[0] ,因為我無法分辨數組中的 position 'Banana' 風味。

除了在 foreach 中再次循環之外,還有什么解決方案?

萬分感謝

首先,我們可以使用array_walk_recursive()來展平您的數組,這只是擺脫了嵌套的 arrays。

接下來,我們使用array_flip()來交換展平數組中的鍵/值。 這使得獲取特定術語的 ID 變得更加容易。

<?php

$flavours = [
    [799390 => 'Banana'],
    [799391 => 'Chocolate']
];

//flatten array
//Produces: Array ( [799390] => Banana [799391] => Chocolate )
array_walk_recursive($flavours,
    function($v, $k) use (&$temp) { 
        $temp[$k] = $v; 
    }
);

//flip array. Swaps keys with values.
//Produces: Array ( [Banana] => 799390 [Chocolate] => 799391 )
$flavours = array_flip($temp);

現在您可以很容易地獲得 ID,例如$flavours['Banana']


如果您有一個非常非常大的數組,此方法可能會變慢。 但是,我在廉價的虛擬主機上用 100,000 個值對此進行了測試,並運行了該方法幾次(20-25 次)。 它始終以大約(通常低於)0.1 毫秒(大約 0.0014 秒)完成。

您可以插入一個if語句來為您的循環設置一個條件

foreach ($flavours as $key => $value) {
  if($key =  array_search('Banana', $value)){
   echo $key; 
 }
}

Output

799390

如果要搜索的單詞是不同的大小寫,許多常用的數組方法在嘗試查找匹配項時將不起作用,但是使用preg_grep將允許以不區分大小寫的方式找到匹配項。

function findflavour( $search, $haystack ){
    foreach( $haystack as $index => $arr ){
        $res=preg_grep( sprintf( '@%s@i', $search ), $arr );
        if( !empty( $res ) ) return array_search( array_values( $res )[0], $arr );
    }
    return false;
}



$search='BaNanA';
$flavours=array(
    array( 799390 => 'Banana' ),
    array( 799391 => 'Chocolate' ),
    array( 729361 => 'Chilli' ),
    array( 879695 => 'Apple' ),
    array( 995323 => 'Avacado' ),
    array( 528362 => 'Orange' ),
    array( 723371 => 'Cherry' ),
);


printf( 'Key:%s', findflavour( $search, $flavours ) );

如果源數組中可能有多個元素具有相同的值但不同的 ID,則findflavour function 的版本略有不同

function findflavour( $search, $haystack, $multiple=false ){
    $keys=[];
    foreach( $haystack as $index => $arr ){
        $res=preg_grep( sprintf( '@%s@i', $search ), $arr );
        if( !empty( $res ) ) {
            $key=array_search( array_values( $res )[0], $arr );
            if( $multiple )$keys[]=$key;
            else return $key;
        }
    }
    return $multiple ? $keys : false;
}


$multiple=true;
$search='AVacAdo';
$flavours=array(
    array( 799390 => 'Banana' ),
    array( 799391 => 'Chocolate' ),
    array( 291333 => 'Avacado' ),
    array( 729361 => 'Chilli' ),
    array( 879695 => 'Apple' ),
    array( 995323 => 'Avacado' ),
    array( 528362 => 'Orange' ),
    array( 723371 => 'Cherry' ),
);


printf( 'Key(s): %s', print_r( findflavour( $search, $flavours, $multiple ), true ) );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM