首页 > 解决方案 > PHP将值推送到嵌套数组

问题描述

我在 php 中创建了以下对象数组

$treeData[] = (object) array(
    "name"=> "A",
    "children" => [
        [
            "name"=> "A1", 
            "children"=> [ 
                [ 
                    "name"=> "A1.1",
                    "children"=> [ 
                        [
                            "name"=> "A1.1.1",
                            "children"=> [ 
                                ....

我正在尝试A1.1.1根据以下条件在子级内部推送新值:

foreach ($treeData as $value) {
    if ($value->name == 'A') {
        $value->name[][] = (object) array(
                                           "name"=> "ChildA", 
                                           "children"=> ""
                                    );
        break;
    }
}

但这给了我一个错误

预期结果应与以下示例匹配:

$treeData[] = (object) array(
    "name"=> "A",
    "children" => [
        [
            "name"=> "A1",
            "children"=> [ [
                "name"=> "A1.1",
                "children"=> [ [
                    "name"=> "A1.1.1",
                    "children"=> [ 
                        [
                            "name"=> "ChildA",
                            "children"=> [ [ 
                                "name"=> "ChildA1"
                            ] ]
                        ],
                        [
                            "name"=> "ChildA",
                            "children"=> [ [
                                "name"=> "ChildA2"
                            ] ]
                        ],
                    ]
                ] ]
            ] ]
        ]
   ]);   

我在这里做错了什么或以不同方式实现这一目标的任何方式

我得到的错误:

“致命错误:未捕获的错误:字符串不支持 [] 运算符”

标签: phparraysobject

解决方案


首先,您会遇到错误:$value->name[][]. 请注意,名称是一个字符串,因此您不能[]在其上使用(数组附加运算符)。

如果我是你,我会采用递归方法。考虑以下伪代码:

function addChild($root, $addToName, $nameToAdd) {
    if ($root->name == $addToName)
        $root->children[] =  (object) array("name"=> $nameToAdd, "children"=> []);
    else 
        foreach($root->children as $child)
            addChild($child, $addToName, $nameToAdd);
}  

现在电话是:addChild($treeData, 'A', "ChildA")


推荐阅读