在foreach中结合In_array

时间:2017-07-30 18:42:31

标签: php foreach

我在foreach()循环中使用多个in_array时遇到问题, 我想找到一个键,其中说金属和prod id匹配一组给定的m(对于金属),p(对于prod)。

代码是:

 $arr = array(

       0 =>array(
         'metal'=>0,
         'prod'=>0
       ),

       1 =>array(
         'metal'=>1,
         'prod'=>1
       ),

      2 =>array(
        'metal'=>2,
        'prod'=>2
      ),

     3 =>array(
      'metal'=>3,
      'prod'=>3
     )
);

$m=1;$p=1;


foreach($arr as $k => $v)
{
//print_r($v);
 foreach($v as $r) {
    if(in_array($m,$v) && in_array($p,$v)) {
        echo $k;
        echo '<br>';
    }
    else {
        echo 'no';
        echo '<br>';
    }

}

}

输出:

   no
   no
   1
   1
   no
   no
   no
   no

所以对于第0,第2,第3个数组,它给出no,并且它找到了它给出的值,key,我想得到键,对于两个in_array组合(键只应当在两个in_array中回显)是真的)。并且一旦它发现它应该破坏,以便它不会去其他地方。 我尝试使用break,但它没有按预期工作。

1 个答案:

答案 0 :(得分:2)

Yuikes!你经常去那里。首先不要害怕使用更详细的变量,这将有助于阅读代码。

那就是说我认为你是深层次的一级

$metal=1;$prod=1;


foreach($arr as $k => $v){
//print_r($v);  = ['metal'=>0, 'prod'=>0]
   if( $v['metal'] == $metal && $v['prod'] == $prod )
        echo $k;  //should be an int like  0,1,2
        echo '<br>'; 
        break;
    }else {
        echo 'no';
        echo '<br>';
    }

}

你遇到的另一个问题是,你必须确定这些项目,你不能只做in_array并希望最好。

考虑一下

  $array = ['metal' => 2, 'prod'=>1]

  //matches with in_array in the wrong order
  $prod = 2;  //$array['prod'] = 1
  $metal = 1; //$array['metal'] = 2

  //matches with in_array 2x on $array['prod'] 
  $prod = 1;  //$array['prod'] = 1
  $metal = 1; //$array['metal'] = 2

如果你使用in_array,就像你已经过去一样,因为12都在数组中,但它们并不是他们需要的地方。那是你想要的行为吗?这就是我所说的nieve实现,因为它不考虑任何边缘情况。

事实上,两次拨打in_array( 1, $array)也会与上述情况相符。这是多余的,因为1将匹配$array['prod'] = 1两次。

<强>继续

您的break似乎无效,因为您有2个嵌套循环。它确实有效,但是当你在内部调用break时它会退出该循环,但仍然在父循环中。基本上(使用您的代码)这没有任何效果,因为内部循环已经完成了对if的评估并且仍然退出。

修复它的方法(如果你有2个循环,或循环中的开关)是使用中断的级别。例如:

foreach($arr as $k => $v){
//print_r($v);
 foreach($v as $r) {
    if(in_array($m,$v) && in_array($p,$v)) {
        echo $k;
        echo '<br>';
        break 2;  //notice the 2, break out of parent loop
    }else{
        echo 'no';
        echo '<br>';
    }
}

干杯!