我用循环引用创建了这个数组:
$arr = array(1 => 'one', 2 => 'two');
$arr[3] = &$arr;
我有一个函数可以递归地打印出数组中的值,但我确实无法解决创建循环引用检查的问题。你怎么能这么做呢?
我用于打印数组的当前函数复制如下。我没有包括我在进行循环引用检查时所做的各种尝试。它们主要围绕维持$seen
已打印的项目数组对于每个递归分支。这是因为我仍然希望允许打印重复值,只是如果它是正在解析的当前数组的父级,则不打印该值。
我遇到的问题是弄清楚如何向此添加引用而不是数组副本$seen
多变的。但如果有效的话,我很乐意同时使用另一种策略。
function HTMLStringify($arr)
{
if(is_array($arr)){
$html = '<ul>';
foreach ($arr as $key => $value) {
$html .= '<li>' . $key;
if(is_array($value)){
//Conspicuously missing is a circular reference check,
//causing infinite recursion. After a few failed attempts
//at checking for this (e.g. discovering that array_push doesn't take references)
//I have left it for further study.
//(After all, Javascript's JSON.stringify() doesn't check for circular references)
//TODO: Check for circular references
$html .= HTMLStringify($value, $seen);
}
elseif(is_numeric($value) || is_string($value) || is_null($value))
{
$html .= ' = ' . $value;
}
else
{
$html .= ' [couldn\'t parse ' . gettype($value) . ']';
}
$html .= '</li>';
}
$html .= '</ul>';
return $html;
}
else
{
return null;
}
}
您的代码的改编版本,使用严格的in_array
检查来自Ryan Vincent 链接的答案 https://stackoverflow.com/questions/8460011/in-array-on-objects-with-circular-references,如下图所示:
function HTMLStringify($arr, array $seen = array()) {
if (is_array($arr)) {
$seen[] = $arr;
$html = '<ul>';
foreach ($arr as $key => $value) {
$html .= '<li>' . $key;
if (is_array($value)) {
if (in_array($value, $seen, true)) {
// Deal with recursion in your own way here
$html .= ' [RECURSION]';
} else {
$html .= HTMLStringify($value, $seen);
}
} elseif (is_numeric($value) || is_string($value) || is_null($value)) {
$html .= ' = ' . $value;
} else {
$html .= ' [couldn\'t parse ' . gettype($value) . ']';
}
$html .= '</li>';
}
return $html . '</ul>';
} else {
return null;
}
}
$arr = array(1 => 'one', 2 => 'two');
$arr[3] = &$arr;
echo HTMLStringify($arr);
比较多个 PHP 版本 http://3v4l.org/eRMBq,看起来这适用于 PHP 5.3.15+ 和 PHP 5.4.5+。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)