我在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,但它没有按预期工作。
答案 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,就像你已经过去一样,因为1
和2
都在数组中,但它们并不是他们需要的地方。那是你想要的行为吗?这就是我所说的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>';
}
}
干杯!