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 …

0

2 Answers 2

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) ""
      }
    }
Sign up to request clarification or add additional context in comments.

1 Comment

Nice! Thanks! Trying it now.
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;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.