phparraysnested-sets

Convert multidimensional array to nested set array


im having a little problem i need some help with. Im trying to convert a multidimensional array into a flatten array with nested set values right and left like so:

    $array = {
         'id' => 1
         'name' => 'john'
         'childs' => array(
             array(
                 'id' => 1
                 'name' => 'jane'
             )
          )        
    }

to

    $array = {
         array(
           'id' => 1,
           'name' => 'john'
           'left' => '1'
           'right' => '4'
         ),
         array(
           'id' => 1,
           'name' => 'jane'
           'left' => '2'
           'right' => '3'
         )
    }

Any help is appreciated!


Solution

  • I asked a very similar question and got a result, so thought I'd send it on for you. I realise this is quite an old topic, but still worth getting an answer. I've included my data, but would be easily adapted for yours.

    $JSON = '[{"id":1,"children":[{"id":2,"children":[{"id":3},{"id":4}]},{"id":5}]}]';
    $cleanJSON = json_decode($JSON,true);
    
    $a_newTree = array();       
    
    function recurseTree($structure,$previousLeft) 
    {
        global $a_newTree;  // Get global Variable to store results in.
    
        $indexed = array();                     // Bucket of results.       
        $indexed['id'] = $structure['id'];      // Set ID
        $indexed['left'] = $previousLeft + 1;   // Set Left
    
        $lastRight = $indexed['left'];
    
        $i_count = 0;
        if ($structure['children'])
        {
            foreach ($structure['children'] as $a_child)
            {
                $lastRight = recurseTree($structure['children'][$i_count],$lastRight);
                $i_count++;
            }
        }
    
        $indexed['right'] = $lastRight + 1;     // Set Right
    
        array_push($a_newTree,$indexed);        // Push onto stack
    
        return $indexed['right'];       
    }
    
    recurseTree($cleanJSON[0],0);
    print_r($a_newTree);