0

何らかの理由で、次の手段を使用して配列をループすると、break ステートメントに抵抗し、配列の最後の要素まで再帰的にループし続けます。

function loop($target, $array) {
  if($this) {
    if(!isset($GLOBALS["loop"])) {
      $GLOBALS["loop"]+=1;
      $GLOBALS["arrayCount"] = count($array, COUNT_RECURSIVE);
    }
  }
  $keys = array_keys($array);
  $values = array_values($array);
  for($i=0;$i<count($array);$i++) {
    $GLOBALS["iteration"]+=1;
    if($keys[$i] === $target) {
      print "Found $target.<br>";
      break;
    }
    if(is_array($array[$i])) {
      loop($target, $array[$i]);
    }
    if($values[$i] === $target) {
      print "Found $target.<br>";
      break;
    }
    if($GLOBALS["iteration"] >= $GLOBALS["arrayCount"]) {
      print "Looped array.<br>";
      break;
    }
}

どんな助けでも大歓迎です!

解決済み: exit ステートメントを追加する必要があったため、何らかの理由で消えた謎のコメントのおかげです! ただし、再帰ループを停止するには break ステートメントが不十分である理由を知ることは興味深いでしょう。

4

3 に答える 3

1

私は実際に問題を見つけました...

次のコード:

if(is_array($array[$i])) {
  loop($target, $array);
}

する必要があります:

if(is_array($array[$i])) {
  loop($target, $array[$i]);
}
于 2012-05-18T01:29:16.483 に答える
0

それはかなり奇妙なループです。組み込み型を使用して独自の再帰を記述することを避けることができます。これがあなたがやろうとしていることだと思います:

<? //PHP 5.4+

$loop = static function($target, array $array){
    $query = $array;
    $query = new \RecursiveArrayIterator($query);
    $query = new \RecursiveIteratorIterator(
        $query, 
        \RecursiveIteratorIterator::SELF_FIRST
    );
    foreach($query as $key => $value){
        if ($key === $target){
            return "Found $target (key)";
        } elseif ($value === $target){
            return "Found $target (value)";
        }
    }
};

$testData = [
 'key1' => 'value1',       
 'key2' => 'value2',
 'key3' => [
     'key4' => 'value4',
 ],      
];

echo
    $loop('key2', $testData), '<br/>',
    $loop('key3', $testData), '<br/>',
    $loop('key4', $testData), '<br/>',
    $loop('value4', $testData), '<br/>'
;
/*
Found key2 (key)
Found key3 (key)
Found key4 (key)
Found value4 (value)
 */
?>
于 2012-05-18T07:12:17.503 に答える
0

推測ですが、これらのステートメントはelse ifs である必要がありますか? 意図的でない限り、奇妙な再帰の問題が発生する可能性があります。

于 2012-05-18T01:23:03.960 に答える