PHP数组循环没有破坏

时间:2012-05-18 01:18:16

标签: php arrays loops iteration

由于某种原因,使用以下方法循环数组会阻止其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语句不足以阻止递归循环会很有趣。

3 个答案:

答案 0 :(得分:1)

我实际上发现了这个问题......

以下代码:

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

应该是:

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

答案 1 :(得分:0)

只是一个猜测,但也许这些陈述应该是else if s?可能会导致一些奇怪的递归问题,除非这是故意的。

答案 2 :(得分: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)
 */
?>