'Php Recursivity: Convert a multidimensional associative array into an array that contains each level of data

I am looking for the best way to convert a multidimensional associative array into a new array, where each row is the concatenation of each column ex :

$datas[] = [
        "id" => "1000",
        "parent" => "0",
        "level" => "1",
        "children" => [
            [
                "id" => "1001",
                "parent" => "1000",
                "level" => "2",
                "children" => [
                    [
                        "id" => "1002",
                        "parent" => "1001",
                        "level" => "3",
                        "children" => [
                            [
                                "id" => "1003",
                                "parent" => "1002",
                                "niveau" => "4",
                            ],
                            [
                                "id" => "1004",
                                "parent" => "1002",
                                "niveau" => "4",
                            ],
                            [
                                "id" => "1005",
                                "parent" => "1002",
                                "niveau" => "4",
                            ]
                        ]
                    ],
                    [

                    ]
                ]
            ],
            [
                "id" => "1006",
                "parent" => "1000",
                "level" => "2"
            ]
        ],
        [
            "id" => "1007",
            "parent" => "0",
            "level" => "1"
        ]
    ];

Here's my method :

public function recursData(array $datas, &$str ="", &$row =[], int $level = 0)
        {
            $level++;
    
            foreach ($datas as $data) {
                foreach($data as $key => $d) {
                    if (is_array($d)) {
                        $this->recursData($d, $str, $row,$level);
                    } else {
                        $str.= "{$level}_{$key}_{$d}|";
                        if ($key == "parent") {
                            $row[] = $str;
                        }
                    }
                }
            }
    
            return $row;
        }

Output (not what i'm looking for) :

array:8 [
      0 => "1_id_1000|1_parent_0|"
      1 => "1_id_1000|1_parent_0|2_id_1001|2_parent_1000|"
      2 => "1_id_1000|1_parent_0|2_id_1001|2_parent_1000|3_id_1002|3_parent_1001|"
      3 => "1_id_1000|1_parent_0|2_id_1001|2_parent_1000|3_id_1002|3_parent_1001|4_id_1003|4_parent_1002|"
      4 => "1_id_1000|1_parent_0|2_id_1001|2_parent_1000|3_id_1002|3_parent_1001|4_id_1003|4_parent_1002|4_id_1004|4_parent_1002|"
      5 => "1_id_1000|1_parent_0|2_id_1001|2_parent_1000|3_id_1002|3_parent_1001|4_id_1003|4_parent_1002|4_id_1004|4_parent_1002|4_id_1005|4_parent_1002|"
      6 => "1_id_1000|1_parent_0|2_id_1001|2_parent_1000|3_id_1002|3_parent_1001|4_id_1003|4_parent_1002|4_id_1004|4_parent_1002|4_id_1005|4_parent_1002|2_id_1006|2_parent_1000|"
      7 => "1_id_1000|1_parent_0|2_id_1001|2_parent_1000|3_id_1002|3_parent_1001|4_id_1003|4_parent_1002|4_id_1004|4_parent_1002|4_id_1005|4_parent_1002|2_id_1006|2_parent_1000|1_id_1007|1_parent_0|"
    ]

The output i'm looking for:

array:8 [
      0 => "1_id_1000|1_parent_0"
      1 => "1_id_1000|1_parent_0|2_id_1001|2_parent_1000"
      2 => "1_id_1000|1_parent_0|2_id_1001|2_parent_1000|3_id_1002|3_parent_1001"
      3 => "1_id_1000|1_parent_0|2_id_1001|2_parent_1000|3_id_1002|3_parent_1001|4_id_1003|3_parent_1002"
      4 => "1_id_1000|1_parent_0|2_id_1001|2_parent_1000|3_id_1002|3_parent_1001|4_id_1004|3_parent_1002"
      5 => "1_id_1000|1_parent_0|2_id_1001|2_parent_1000|3_id_1002|3_parent_1001|4_id_1005|3_parent_1002"
      6 => "1_id_1000|1_parent_0|2_id_1006|2_parent_1000"
      7 => "1_id_1007|1_parent_0"
]

I'm stuck to finish this properly, I tried lot of things, but can't understand what to do obtain what I want to resolve this. Hope someone could help :)



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source