为了账号安全,请及时绑定邮箱和手机立即绑定

PHP:不在 foreach 内循环

PHP:不在 foreach 内循环

PHP
慕村9548890 2023-07-15 17:43:43
我有这个数组:$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 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

首先,我们可以使用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']。


如果您有一个非常大的数组,此方法可能会变得很慢。然而,我在廉价的网络主机上用 100,000 个值对此进行了测试,并运行了该方法几次(20-25 次)。它始终以大约(通常低于)0.1 毫秒(即大约 0.0014 秒)完成。


查看完整回答
反对 回复 2023-07-15
?
浮云间

TA贡献1829条经验 获得超4个赞

您可以插入一条if语句来设置循环条件:


foreach ($flavours as $key => $value) {

  if($key =  array_search('Banana', $value)){

   echo $key; 

 }

}

输出


799390


查看完整回答
反对 回复 2023-07-15
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

如果正在搜索的单词大小写不同,则在尝试查找匹配项时,许多常用的数组方法将不起作用,但是使用“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 ) );


查看完整回答
反对 回复 2023-07-15
  • 3 回答
  • 0 关注
  • 148 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号