【发布时间】:2014-07-15 20:32:15
【问题描述】:
我用循环引用创建了这个数组:
$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;
}
}
【问题讨论】:
-
stackoverflow.com/questions/6292164/… 这可能会对您有所帮助。
标签: php arrays recursion circular-reference