Как я могу манипулировать вложенным массивом в PHP с помощью рекурсии? - PullRequest
1 голос
/ 18 апреля 2020

Я хотел бы заменить несколько foreach операций на рекурсивную функцию или встроенную функцию, которая работает с вложенными массивами.

У меня есть объект, который описывает отношения между таблицами в базе данных. Каждая объединенная таблица представляет собой похожий объект, добавленный в свойство "children".

"dataObject": "job",
"data": {
    "guid": "{{guid}}"
    [...]
        },
"children": {
    "invoice": {
        "dataObject": "invoice",
        "data": {
            "guid": "{{guid}}"
            [...]
        },
        "children": {
            "payment": {
                "dataObject": "payment",
                "data": {
                    "guid": "{{guid}}"
                    [...]
                },
                "children": {
                    "paymentType": {
                        "dataObject": "paymentType",
                        "data": {
                           "guid": "{{guid}}"
                           [...]
                        },
                        "children": null
                    }
                }
            }
        }
    }
}

Я могу добавить данные из массива (результат PDO) к объектам, используя метод.

$myObject->set($row);

Я хочу вернуть вложенный массив в виде:

{
"job": {
    "fcfa88e0-af7b-4829-a02a-0a8bb95a2a99": {
        "guid": "fcfa88e0-af7b-4829-a02a-0a8bb95a2a99",
        "jobproperty1": "",
        "jobproperty2": "",
        "invoice": {
            "89ff1cd5-d510-4494-8f39-56a68ebb7879": {
                "guid": "89ff1cd5-d510-4494-8f39-56a68ebb7879",
                "invoiceProperty1": '',
                "invoiceProperty2": '',
                "payment": {
                    "1949c62b-6514-4f3d-85a3-07cd7a2b9f8a": {
                        "guid": 1949c62b-6514-4f3d-85a3-07cd7a2b9f8a,
                        "paymentProperty1": "",
                        "paymentProperty2": "",
                        "paymentType": {
                            "9800184e-e1fd-4a9d-a6ef-0673bb95c38e": {
                                "guid": "9800184e-e1fd-4a9d-a6ef-0673bb95c38e",
                                "title": null,
                                "paid": null,
                            }
                        }
                    }
                }
            }
        }
    }
}

Я могу добиться этого, используя несколько операций foreach, чтобы добавить это к outputObject, но это кажется чудовищным.

public function children($rootObject, $row){
    $rootObject->set($row);
    $this->outputObject->content[$rootObject->guid] = $rootObject->data;
    foreach($rootObject->children as $child){
        $child->set($row);
        $this->outputObject->content[$rootObject->guid][$child->dataObject][$child->guid] = $child->data;
        foreach($child->children as $grandchild){
            $grandchild->set($row);
            $this->outputObject->content[$rootObject->guid][$child->dataObject][$child->guid][$grandchild->dataObject][$grandchild->guid] = $grandchild->data;
            foreach($grandchild->children as $greatgrandchild){
                $greatgrandchild->set($row);
                $this->outputObject->content[$rootObject->guid][$child->dataObject][$child->guid][$grandchild->dataObject][$grandchild->guid][$greatgrandchild->dataObject][$greatgrandchild->guid] = $greatgrandchild->data;
            }
        }
    }
}

Я использую рекурсивную функцию для манипулирования outputObject, но результат не является вложенным. Есть ли встроенная или пользовательская функция, которая будет достигать этого?

public function childs($thisObject, $row, $path){
    $thisObject->set($row);
    $path = $path[$thisObject->dataObject][$thisObject->guid];
    $this->outputObject->content[$path][$thisObject->guid] = $thisObject->data;
    if(is_array($thisObject->children)){
        foreach($thisObject->children as $child){
            $this->childs($child, $row, $path);
        }
    }
}

Выходные данные моей рекурсивной функции не отображают вложенный массив, только одно измерение.

{
"content": {
    "f": {
        "fcfa88e0-af7b-4829-a02a-0a8bb95a2a99": {
            "guid": "fcfa88e0-af7b-4829-a02a-0a8bb95a2a99",
            "jobProperty1": "...",
            "jobProperty2": "..."
        },
        "1949c62b-6514-4f3d-85a3-07cd7a2b9f8a": {
            "guid": "1949c62b-6514-4f3d-85a3-07cd7a2b9f8a",
            "paymentProperty1": "...",
            "paymentProperty2": "..."
        },
        "9800184e-e1fd-4a9d-a6ef-0673bb95c38e": {
            "guid": "9800184e-e1fd-4a9d-a6ef-0673bb95c38e",
            "paymentTypeProperty1": "...",
            "paymentTypeProperty2": "..."
        },
        "89ff1cd5-d510-4494-8f39-56a68ebb7879": {
            "guid": "89ff1cd5-d510-4494-8f39-56a68ebb7879",
            "invoiceProperty1": "...",
            "invoiceProperty2": "..."
        }
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...