fork(2) download
  1. <?php
  2. $array = [
  3. ['level'=>1, 'name' => 'Root #1'],
  4. ['level'=>1, 'name' => 'Root #2'],
  5. ['level'=>2, 'name' => 'subroot 2-1'],
  6. ['level'=>3, 'name' => '__subroot 2-1/1'],
  7. ['level'=>2, 'name' => 'subroot 2-2'],
  8. ['level'=>1, 'name' => 'Root #3']
  9. ];
  10.  
  11. function buildTree(array &$nodes) {
  12. $activeNodes = [];
  13.  
  14. foreach ($nodes as $index => &$node) {
  15. $node['children'] = [];
  16. $level = $node['level'];
  17. $activeNodes[$level] = &$node;
  18.  
  19. if ($level > 1) {
  20. $activeNodes[$level - 1]['children'][] = &$node;
  21. unset($nodes[$index]);
  22. }
  23. }
  24. }
  25.  
  26. buildTree($array);
  27. echo '<pre>';
  28. var_dump($array);
Success #stdin #stdout 0.01s 20520KB
stdin
Standard input is empty
stdout
<pre>array(3) {
  [0]=>
  array(3) {
    ["level"]=>
    int(1)
    ["name"]=>
    string(7) "Root #1"
    ["children"]=>
    array(0) {
    }
  }
  [1]=>
  array(3) {
    ["level"]=>
    int(1)
    ["name"]=>
    string(7) "Root #2"
    ["children"]=>
    array(2) {
      [0]=>
      array(3) {
        ["level"]=>
        int(2)
        ["name"]=>
        string(11) "subroot 2-1"
        ["children"]=>
        array(1) {
          [0]=>
          array(3) {
            ["level"]=>
            int(3)
            ["name"]=>
            string(15) "__subroot 2-1/1"
            ["children"]=>
            array(0) {
            }
          }
        }
      }
      [1]=>
      array(3) {
        ["level"]=>
        int(2)
        ["name"]=>
        string(11) "subroot 2-2"
        ["children"]=>
        array(0) {
        }
      }
    }
  }
  [5]=>
  array(3) {
    ["level"]=>
    int(1)
    ["name"]=>
    string(7) "Root #3"
    ["children"]=>
    array(0) {
    }
  }
}