微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP:从递归函数返回一个数组

我有一个像这样的数组:
SimpleXMLElement Object
(
    [browseNodes] => SimpleXMLElement Object
        (
            [browseNode] => SimpleXMLElement Object
                (
                    [browseNodeId] => 969391031
                    [Name] => Bambine e ragazze
                    [Children] => SimpleXMLElement Object
                        (
                            [browseNode] => Array
                                (
                                    [0] => SimpleXMLElement Object
                                        (
                                            [browseNodeId] => 969394031
                                            [Name] => Calze
                                        )

                                    [1] => SimpleXMLElement Object
                                        (
                                            [browseNodeId] => 3635837031
                                            [Name] => Felpe
                                        )

                                    [2] => SimpleXMLElement Object
                                        (
                                            [browseNodeId] => 3635838031
                                            [Name] => Giacche
                                        )

                                    [3] => SimpleXMLElement Object
                                        (
                                            [browseNodeId] => 3635839031
                                            [Name] => Guanti da giocatore
                                        )

                                    [4] => SimpleXMLElement Object
                                        (
                                            [browseNodeId] => 969392031
                                            [Name] => Maglie
                                        )

                                    [5] => SimpleXMLElement Object
                                        (
                                            [browseNodeId] => 4351854031
                                            [Name] => Maglie per tifosi
                                        )

                                    [6] => SimpleXMLElement Object
                                        (
                                            [browseNodeId] => 3635840031
                                            [Name] => Magliette da portiere
                                        )

                                    [7] => SimpleXMLElement Object
                                        (
                                            [browseNodeId] => 969393031
                                            [Name] => Pantaloncini
                                        )

                                    [8] => SimpleXMLElement Object
                                        (
                                            [browseNodeId] => 3635841031
                                            [Name] => Pantaloncini da portiere
                                        )

                                    [9] => SimpleXMLElement Object
                                        (
                                            [browseNodeId] => 3635842031
                                            [Name] => Pantaloni
                                        )

                                    [10] => SimpleXMLElement Object
                                        (
                                            [browseNodeId] => 3635843031
                                            [Name] => Tute da ginnastica
                                        )

                                )

                        )

                    [Ancestors] => SimpleXMLElement Object
                        (
                            [browseNode] => SimpleXMLElement Object
                                (
                                    [browseNodeId] => 969386031
                                    [Name] => Abbigliamento
                                    [Ancestors] => SimpleXMLElement Object
                                        (
                                            [browseNode] => SimpleXMLElement Object
                                                (
                                                    [browseNodeId] => 937258031
                                                    [Name] => Calcio
                                                    [Ancestors] => SimpleXMLElement Object
                                                        (
                                                            [browseNode] => SimpleXMLElement Object
                                                                (
                                                                    [browseNodeId] => 524013031
                                                                    [Name] => Categorie
                                                                    [IsCategoryRoot] => 1
                                                                    [Ancestors] => SimpleXMLElement Object
                                                                        (
                                                                            [browseNode] => SimpleXMLElement Object
                                                                                (
                                                                                    [browseNodeId] => 524012031
                                                                                    [Name] => Sport e tempo libero
                                                                                )

                                                                        )

                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)

我需要做的是使用Anchestors构建一个面包屑.列表末尾的那个应该是第一个.所以,作为一个例子:

Sport e tempo libero>分类> CALCIO …

我试图用这种方式迭代xml而没有成功:

$rec=$result->browseNodes->browseNode->Ancestors->browseNode;

    $bread=array();
    function recursive($r)
    {
        do{
            $bread[]=$r->browseNodeId;
            recursive($r->Ancestors->browseNode);
        }while(isset($r->Ancestors));
        $bread=array_reverse($bread);
        return $bread;
    }

    print_r(recursive($rec));

我在stackoverflow上发现了类似的东西,但没有任何建议帮助我解决这个问题.

要使用输出创建递归函数,您需要三件事:

>用于保存当前位置的变量或参数,即代码中的$r.
你有这个权利.
>保存结果的变量或参数,您没有.
起初它似乎是$bread,但它没有保持任何值,因为每次调用recursive()时它都是空的.
一个简单的解决方案是在函数内声明它是全局的.
> if语句,用于检查您没有的停止条件.
相反,您的代码中有一个do-while循环.

那么,你有两个错误.
根据您的代码并尽可能少地修改它,这是正确的代码

$rec = $result->browseNodes->browseNode->Ancestors->browseNode;

$bread = array();
function recursive($r)
{
    global $bread;

    $bread[] = strval($r->browseNodeId);

    if(isset($r->Ancestors)){
        return recursive($r->Ancestors->browseNode);
    }else{
        return array_reverse($bread);
    }
}

print_r(recursive($rec));

你去吧

更新:我同意@FlameStorm,如果可能,应该避免全局.
我也收到了使用static的建议,但它引入了一个bug.
因此,如果您不确定如何使用它,我建议也避免静电.

这是改进的代码

$rec = $result->browseNodes->browseNode->Ancestors->browseNode;

function recursive($r)
{
    if(isset($r->Ancestors))
        $bread = recursive($r->Ancestors->browseNode);

    $bread[] = strval($r->browseNodeId);
    return $bread;
}

print_r(recursive($rec));

不再需要函数外部的$bread变量.此外,既不使用全局也不使用静态.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐