0

Trying to get a multidimensional array from my flat data

available raw data

This raw data ist available to me. I need to build a multidimensional array where all children are stored within their respective parents.

Array
(
    [index] => Array
    (
        [slug] => index
        [parent_slug] => 
    )
    [praxis-und-team] => Array
    (
        [slug] => praxis-und-team
        [parent_slug] => 
    )
    [leistungen] => Array
    (
        [slug] => leistungen
        [parent_slug] => praxis-und-team
    )
    [partner-und-netzwerk] => Array
    (
        [slug] => partner-und-netzwerk
        [parent_slug] => 
    )
    [notfall] => Array
    (
        [slug] => notfall
        [parent_slug] => 
    )
    [impressum] => Array
    (
        [slug] => impressum
        [parent_slug] => leistungen
    )
)

needed data

It's all about the slug/parent_slug pairing. There might be more sublevels, so it has to be recursive until parent_slug == '' is reached at the topmost level. This is what the output should look like:

Array
(
    [index] => Array
    (
        [slug] => index
        [parent_slug] => 
    )
    [praxis-und-team] => Array
    (
        [slug] => praxis-und-team
        [parent_slug] => 
        [children] => Array
        (
            [leistungen] => Array
            (
                [slug] => leistungen
                [parent_slug] => praxis-und-team
                [children] => Array
                (
                    [impressum] => Array
                    (
                        [slug] => impressum
                        [parent_slug] => leistungen
                    )
                )
            )
        )
    )
    [partner-und-netzwerk] => Array
    (
        [slug] => partner-und-netzwerk
        [parent_slug] => 
    )
    [notfall] => Array
    (
        [slug] => notfall
        [parent_slug] => 
    )
)

Thank you very much in advance for your help! Sorry if I failed to make light of the problem. I‘ve been looking at it for to long already …

maxpower9000
  • 223
  • 2
  • 8

2 Answers2

1

Assumption: The entries in the array are from the outermost to the innermost. Thus we could revert the original array, walk thru it in one pass, restructure it, and revert it again (if necessary).

Code

    <?php
    $myarray = array(
        'index' => array(
            'slug' => 'index',
            'parent_slug' => '',
        ),
        'praxis-und-team' => array (
            'slug' => 'praxis-und-team',
            'parent_slug' => '',
        ),
        'leistungen' => array(
            'slug' => 'leistungen',
            'parent_slug' => 'praxis-und-team',
        ),
        'partner-und-netzwerk' => array (
            'slug' => 'partner-und-netzwerk',
            'parent_slug' => '',
        ),
        'notfall' => array(
            'slug' => 'notfall',
            'parent_slug' => '',
        ),
        'impressum' => array (
            'slug' => 'impressum',
            'parent_slug' => 'leistungen',
        ),
    );

    echo '<pre>'; var_dump($myarray); echo '</pre>';

    // We want to work from bottom to top
    $myarray = array_reverse($myarray, true);

    foreach($myarray as $key => $item) {
        if (!empty($myarray[$key]['parent_slug'])) {
            $myarray[$myarray[$key]['parent_slug']]['children'][$key] = $myarray[$key];
            unset($myarray[$key]);
        }
    }

    // Now reverse the array again.
    $myarray = array_reverse($myarray, true);

    echo '<pre>'; var_dump($myarray); echo '</pre>';


    ?>

Output

    array(4) {
      ["index"]=>
      array(2) {
        ["slug"]=>string(5) "index"
        ["parent_slug"]=>string(0) ""
      }
      ["praxis-und-team"]=>
      array(3) {
        ["slug"]=>string(15) "praxis-und-team"
        ["parent_slug"]=>string(0) ""
        ["children"]=>
        array(1) {
          ["leistungen"]=>
          array(3) {
            ["slug"]=>string(10) "leistungen"
            ["parent_slug"]=>string(15) "praxis-und-team"
            ["children"]=>
            array(1) {
              ["impressum"]=>
              array(2) {
                ["slug"]=>string(9) "impressum"
                ["parent_slug"]=>string(10) "leistungen"
              }
            }
          }
        }
      }
      ["partner-und-netzwerk"]=>
      array(2) {
        ["slug"]=>string(20) "partner-und-netzwerk"
        ["parent_slug"]=>string(0) ""
      }
      ["notfall"]=>
      array(2) {
        ["slug"]=>string(7) "notfall"
        ["parent_slug"]=>string(0) ""
      }
    }
hherger
  • 1,660
  • 1
  • 10
  • 13
0

I found a solution and ever so slightly adapted it to my data:

function buildTree(array &$elements, $parentId = '')
{
    $branch = array();
    foreach($elements as &$element) {
        if ($element['parent_slug'] == $parentId) {
            $children = buildTree($elements, $element['slug']);
            if ($children)
                $element['children'] = $children;
            $branch[$element['slug']] = $element;
            unset($element);
        }
    }
    return $branch;
}
Community
  • 1
  • 1
maxpower9000
  • 223
  • 2
  • 8