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