2017-07-30 57 views
-2

我在使用多个in_array时出现问题foreach() loop, 我想找到说金属和产品ID匹配给定的m(金属),p(产品)的关键。In_array在foreach中

的代码是:

$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阵列它没有给,并在那里发现的价值它给,钥匙,我想获取密钥,对于两个in_array组合(只有在in_array都为真时,才应回显密钥)。并且一旦它发现它应该破裂,所以它不会去其他地方。 我尝试使用中断,但它没有按预期工作。

+0

该OP的逻辑是有缺陷的,你不应该这样使用'in_array'。 – ArtisticPhoenix

回答

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在数组中,但是它们并不是他们需要的人。这是你想要的行为吗?这就是我所说的一个实现,因为它没有考虑任何边界情况。

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

进一步

break似乎没有工作,因为你有2个环路,即嵌套。它实际上可以工作,但是当你在内部调用break时,它会退出该循环,但仍然在父循环中。基本上(用你的代码)这个没有效果,因为内部循环完成了对if的评估并退出。

解决这个问题的方法(如果你有2个循环,或者循环中有一个开关)就是使用break的级别。例如:

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>'; 
    } 
} 

干杯!