Flat/Merge Array of Arrays and primitve types

Issue

i have an Array like this:

[ [ "id": 1, "name": "Kategorie 1", "parent_id": null, [ "id": 2, "name": "Kategorie 1.1", "parent_id": 1, [ "id": 5, "name": "Kategorie 1.1.1", "parent_id": 2, [ "id": 11, "name": "Kategorie 1.1.1.1", "parent_id": 5,  [] ], [ "id": 12, "name": "Kategorie 1.1.1.2", "parent_id": 5, [] ] , ........]

So this is a Category Hierachy like:

Category 1
 Category 1.1
 Category 1.2
  Category 1.2.1
   Category 1.2.1.1.
Category 2
 Category 2.1.
  Category 2.1.1.
 Category 2.2
 Category 2.3.

But the depth of the Categories is variable.

So is there a way to flat/merge the Array to:

[ [ "id": 1, "name": "Kategorie 1", "parent_id": null], [ "id": 2, "name": "Kategorie 1.1", "parent_id": 1],  [ "id": 5, "name": "Kategorie 1.1.1", "parent_id": 2], [ "id": 11, "name": "Kategorie 1.1.1.1", "parent_id": 5], [ "id": 12, "name": "Kategorie 1.1.1.2", "parent_id": 5] ]

Solution

There you go:

<?php
$array = [
    [
        "id" => 1, "name" => "Kategorie 1", "parent_id" => null,
        [
            "id" => 2, "name" => "Kategorie 1.1", "parent_id" => 1,
            [
                "id" => 5, "name" => "Kategorie 1.1.1", "parent_id" => 2,
                [
                    "id" => 11, "name" => "Kategorie 1.1.1.1", "parent_id" => 5, []
                ],
                [
                    "id" => 12, "name" => "Kategorie 1.1.1.2", "parent_id" => 5, []
                ]
            ]
        ]
    ]
];

function flatMerge(array $array, array &$result = [])
{
    $subResult = [];
    foreach ($array as $key => $sub) {
        if (is_array($sub)) {
            flatMerge($sub, $result);
        } else {
            $subResult[$key] = $sub;
        }
    }
    $result[] = $subResult;
    return $result;
}

$result = flatMerge($array); // flat merge the array
var_dump($result);
$result = array_filter($result, static function (array $array) { // remove empty arrays
    return !empty($array);
});
var_dump($result);
$result = array_values($result); // reset array keys
var_dump($result);

You can see the result of this code here: http://sandbox.onlinephpfunctions.com/code/b4eaddb4a52f5e9cf9a80644190e526613381c60

Answered By – Alexandre97122

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published