2017-07-30 117 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>'; 
    } 
} 

乾杯!