PHP向嵌套数组推送值

3

我已在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"
                            ] ]
                        ],
                    ]
                ] ]
            ] ]
        ]
   ]);   

我在这里做错了什么,或者是否有其他方法可以实现这个目标

我得到的错误:

"致命错误:对于字符串不支持[]操作符"


你能否添加你所遇到的错误,以便更全面地了解其执行情况? :) - Diogo Santo
我已经添加了错误。 - chinthaka siliva
我认为你正在尝试将一个数组强制转换为一个字符串属性的对象。如果我没有记错的话,你不想将它推到$value->name,而是要推到$value->children - Diogo Santo
好的,让我试一下。 - chinthaka siliva
@DiogoSanto 如果我想访问“name”=>“A1.1.1”内部的子级,我应该如何做?我已经编写了以下foreach循环,但是出现错误$testresult = []; foreach ($treeData as $value) { if($value->name == 'A'){ $testresult = $value->children->name; } } - chinthaka siliva
如果您想不断向子元素添加子元素,并始终确保将其添加到最后一个可用位置,则可以使用“do while”循环来实现。这是您的意图吗?我可以为此编写答案。我还可以提供一种面向对象的方法来实现此目的,但需要对您的代码进行相当大的修改 :x - Diogo Santo
1个回答

2
首先,你之所以会得到这个错误,是因为你写成了这样:$value->name[][]。注意,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")。最初的回答。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接