2011-05-08 13 views
2

私は、条件付きの2つの配列を経由するネストされたforeachループを持っています。もし返された値がelse文もまだ実行しているなら、それはなぜですか?それ以外の場合はネストされたforeach

//$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時間と「ファジーマッチ」×10

答えて

2

あなたはbreak文を使ってループを切断する必要があります

は1つの、一致する値のために私はエコー出力を取得します。

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

foreachループは、「完全一致」または「あいまい一致」のいずれかをエコーするすべての要素に対して反復処理を行います。 1つのループ内で両方をエコーし​​てはならないので、私が考えることができるのは、カウントがオフである(11個のアイテム、または「ファジーマッチ」の9エコーのみ)ということです。

あなたは出力1時間に任意の完全一致が見つかった場合、出力1時間に「完全に一致」をしたい、と「ファジーマッチ」の場合正確に一致するものが存在していない場合は、そのようなあなたのループを再構築する必要があります。

$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 
} 
関連する問題