如果没有工作,嵌套的foreach

时间:2011-05-08 20:42:14

标签: php foreach

我有一个嵌套的foreach循环遍历带有条件if - else的2个数组。当if返回一个值时,else语句仍在运行,为什么会这样?

//$global_plugins is an array
//$xml_plugins is a string

foreach($global_plugins as $key => $global_plugins){
  foreach ((array) $xml_plugins as $key2 => $xml_plugins){

  if (($global_plugins == $xml_plugins) && ($plugin_verso[$key] == $xml_plugin_version[$key2])){ 

       echo 'Exact match'; 

  }else{

        echo 'Fuzzy match';

    }

  }

}

对于此示例,数组有10个要匹配的值,当if返回“完全匹配”时,它不应返回“模糊匹配”,但这就是正在发生的事情。

对于1个匹配值,我得到回声输出:“完全匹配”一次和“模糊匹配”x 10

2 个答案:

答案 0 :(得分:2)

您应该使用break语句来中断循环。

foreach($global_plugins as $key => $global_plugins){
  foreach ((array) $xml_plugins as $key2 => $xml_plugins){

  if (($global_plugins == $xml_plugins) && ($plugin_verso[$key] == $xml_plugin_version[$key2])){ 

       echo 'Exact match'; 
       break 2;

  }else{

        echo 'Fuzzy match';
    }

  }

}

答案 1 :(得分:1)

foreach循环将迭代所有元素,回显“完全匹配”或“模糊匹配”。它不应该在一个循环中回显,所以我能想到的是计数是关闭的(11个项目,或者只有9个“模糊匹配”的回声)。

如果你希望'完全匹配'输出一次,如果找到任何完全匹配,并且'模糊匹配'输出一次,如果没有找到完全匹配,你将需要重构你的循环,如下所示:

$found = 0;
foreach($global_plugins as $key => $global_plugins)
{
  foreach ((array) $xml_plugins as $key2 => $xml_plugins)
  {   
    if (($global_plugins == $xml_plugins) && ($plugin_verso[$key] == $xml_plugin_version[$key2]))
    {    
       echo 'Exact match'; 
       $found = 1;
       break 2; // Once a match is found we exit both loops
    }
  }          
}
if ( ! $found)
{
  echo 'Fuzzy match'; // this will only be executed if no match is found
}