递归解析关联数组时如何检查 PHP 中的循环引用?

2024-01-09

我用循环引用创建了这个数组:

$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(使用前将#替换为@)

递归解析关联数组时如何检查 PHP 中的循环引用? 的相关文章

随机推荐