提问者:小点点

PHP:不在foreach内循环


我有这个数组:

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

现在我在一个foreach内循环数据库中的一个集合。 我从数据库中得到'Banana',我需要数组给我799390

我试过:

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

但除非我补充一句:

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

但我无法添加[0],因为我无法判断“香蕉”味在数组中的哪个位置。

除了在foreach内再次循环之外,还有其他解决方案吗?

非常感谢


共3个答案

匿名用户

您可以插入if语句,将循环的条件设置为

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

输出量

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 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 ) );

匿名用户

首先,我们可以使用array_walk_recursive()来平展您的数组,这样就可以去掉嵌套的数组。

接下来,我们使用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']

如果你有一个非常非常大的数组,这个方法可能会变得很慢。 但是,我在我的廉价webhost上用100,000个值测试了这一点,并运行了几次这种方法(20-25次)。 它一直在0.1毫秒左右(通常在0.1毫秒以下)完成,大约是0.0014秒。