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;
    }
}

任何帮助是极大的赞赏!

已解决:它需要附加一个退出语句,所以感谢神秘的评论,无论什么原因消失了!虽然,了解为什么 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 回答