在 PHP 中检查数组是否递归的最佳方法是什么?
给出以下代码:
<?php
$myarray = array('test',123);
$myarray[] = &$myarray;
print_r($myarray);
?>
来自PHP 手册: http://www.php.net/manual/en/language.types.array.php#73936
print_r() 将显示递归当到了第三个的时候
数组的元素。
似乎没有任何其他方法可以扫描数组
递归引用,所以如果你需要检查它们,你必须
使用 print_r() 及其第二个参数来捕获输出并查看
为了这个词递归.
有没有更优雅的检查方式?
附言。这就是我使用正则表达式和 print_r() 检查和获取递归数组键的方法
$pattern = '/\n \[(\w+)\] => Array\s+\*RECURSION\*/';
preg_match_all($pattern, print_r($value, TRUE), $matches);
$recursiveKeys = array_unique($matches[1]);
Thanks
尝试解决“不可能”的问题总是很有趣!
如果递归发生在顶层,下面的函数将检测递归数组:
function is_recursive(array &$array) {
static $uniqueObject;
if (!$uniqueObject) {
$uniqueObject = new stdClass;
}
foreach ($array as &$item) {
if (!is_array($item)) {
continue;
}
$item[] = $uniqueObject;
$isRecursive = end($array) === $uniqueObject;
array_pop($item);
if ($isRecursive) {
return true;
}
}
return false;
}
查看实际效果 http://ideone.com/OqTKSl.
检测递归any级别显然会更加棘手,但我认为我们可以同意这似乎是可行的。
Update
这是递归(不是双关语,但仍然令人愉快)解决方案,可以检测任何级别的递归:
function is_recursive(array &$array, array &$alreadySeen = array()) {
static $uniqueObject;
if (!$uniqueObject) {
$uniqueObject = new stdClass;
}
$alreadySeen[] = &$array;
foreach ($array as &$item) {
if (!is_array($item)) {
continue;
}
$item[] = $uniqueObject;
$recursionDetected = false;
foreach ($alreadySeen as $candidate) {
if (end($candidate) === $uniqueObject) {
$recursionDetected = true;
break;
}
}
array_pop($item);
if ($recursionDetected || is_recursive($item, $alreadySeen)) {
return true;
}
}
return false;
}
查看实际效果 http://ideone.com/2IQwpQ.
当然,也可以通过手动保存堆栈来编写迭代而不是递归,这在出现非常大的递归级别问题的情况下会有所帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)