Home » Php » how can i convert an array to nested array in php

how can i convert an array to nested array in php

Posted by: admin February 25, 2020 Leave a comment

Questions:

i have a function in my project that returns an array like this

array (size=6)
  0 => 
    array (size=4)
      'id' => string '1' (length=1)
      'user_id' => string '1' (length=1)
      'parent_id' => string '0' (length=1)
      'name' => string 'jack' (length=4)
  1 => 
    array (size=4)
      'id' => string '2' (length=1)
      'user_id' => string '6' (length=1)
      'parent_id' => string '1' (length=1)
      'name' => string 'jill' (length=4)
  2 => 
    array (size=4)
      'id' => string '3' (length=1)
      'user_id' => string '7' (length=1)
      'parent_id' => string '2' (length=1)
      'name' => string 'mary' (length=4)
  3 => 
    array (size=4)
      'id' => string '4' (length=1)
      'user_id' => string '2' (length=1)
      'parent_id' => string '1' (length=1)
      'name' => string 'scriptfloor' (length=11)

i would like to convert this into a nested array based on parent id into this

{
  "id": "1",
  "user_id": "1",
  "parent_id": "0",
  "name": "jack",
  "children": [
    {
      "id": "2",
      "user_id": "6",
      "parent_id": "1",
      "name": "jill"
    },
    {
      "id": "4",
      "user_id": "2",
      "parent_id": "1",
      "name": "scriptfloor"
    },
    {
      "id": "6",
      "user_id": "3",
      "parent_id": "1",
      "name": "silas"
    }
  ]
}

so far i have only gone up to one nested level. i would like to be able to make a multi-dimensional array of n-levels . i need this for to build tree hierarchy of users and the users who referred them .Any help will be appreciated

i have used this function where $items is the unsorted array

for ( $count = 0; $count < count( $items ); $count ++ ) {
    if ( count( $items[ $count ] ) > 0 ) {
        foreach ( $items[ $count ] as $itm ) {
            if ( $itm['parent_id'] == $tree['user_id'] ) {
                $tree['children'][] = $itm;
            }

        }

    }

}

How to&Answers:

This problem reveals lot of things to now (reference variable, remove item from array, array structure, continue instruction, …).

As a workaround below, i advice you to loop on the $items list a first time,
next you loop again on the same list to fill children list for each parent,
you need to compare id and parent_id, if it’s true you inject item on parent’s children list, you remove the item to clean your array and then you end statement for current $item iteration.

I hope it’s clear enought.

foreach($items as $k => $item) {
   foreach($items as $j => $parent) {
       if ($item['parent_id'] === $parent['id']) {
           $parents[$j]['children'][] = $item;
           unset($items[$k]);
           continue 2;
       }
   }
}