3v4l.org

run code in 300+ PHP versions simultaneously
<?php class Foo { public function getData() { return [ 1 => [ 'fooa1' => 'bara1', 'fooa2' => 'bara2', 'fooa3' => 'bara3', 'parent' => 0 ], 2 => [ 'food1' => 'bard1', 'food2' => 'bard2', 'food3' => 'bard3', 'parent' => 1 ], 3 => [ 'fooc1' => 'barc1', 'fooc2' => 'barc2', 'fooc3' => 'barc3', 'parent' => 1 ] ]; } public function getDataPattern() { return [ 'a' => [ 'fooa1' => 'bara1', 'fooa2' => 'bara2', 'fooa3' => 'bara3', 'children' => [ 'd' => [ 'food1' => 'bard1', 'food2' => 'bard2', 'food3' => 'bard3', 'parent' => 'a' ], ] ], 'b' => [ 'foob1' => 'barb1', 'foob2' => 'barb2', 'foob3' => 'barb3', 'children' => [ 'c' => [ 'fooc1' => 'barc1', 'fooc2' => 'barc2', 'fooc3' => 'barc3', 'parent' => 'b', 'children' => [ 'e' => [ 'fooe1' => 'bare1', 'fooe2' => 'bare2', 'fooe3' => 'bare3', 'parent' => 'c' ], ] ], ] ], ]; } public function transformArrayToPattern(){ $data = $this->getData(); $nodes = []; foreach($data as $node_name => $node_data){ if(!isset($nodes[$node_data['parent']])) $nodes[$node_data['parent']] = []; $nodes[$node_data['parent']][] = $node_name; } //print_r($nodes); $result = []; foreach($nodes['0'] as $node_name){ $result[$node_name] = $this->dfs($node_name,$nodes,$data); unset($result[$node_name]['parent']); // to unset parent 0 } return $result; } private function dfs($node_name,$nodes,$data){ if(!isset($nodes[$node_name])){ return $data[$node_name]; } $children = []; foreach($nodes[$node_name] as $kid_name){ $children[$kid_name] = $this->dfs($kid_name,$nodes,$data); } return array_merge($data[$node_name],['children' => $children]); } } $o = new Foo(); print_r($o->transformArrayToPattern());
Output for 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.34, 8.2.0 - 8.2.30, 8.3.0 - 8.3.30, 8.4.1 - 8.4.18, 8.5.0 - 8.5.3
Array ( [1] => Array ( [fooa1] => bara1 [fooa2] => bara2 [fooa3] => bara3 [children] => Array ( [2] => Array ( [food1] => bard1 [food2] => bard2 [food3] => bard3 [parent] => 1 ) [3] => Array ( [fooc1] => barc1 [fooc2] => barc2 [fooc3] => barc3 [parent] => 1 ) ) ) )

preferences:
72.41 ms | 1625 KiB | 4 Q