3v4l.org

run code in 300+ PHP versions simultaneously
<?php $data = array( array ( 'category_id' => 20, 'category_name' => 'Category 1', 'main_category' => 0, 'sub_categories' => array( array ( 'category_id' => 25, 'category_name' => 'Category 1.3', 'main_category' => 20, 'sub_categories' => [], ), array ( 'category_id' => 26, 'category_name' => 'Category 1.4', 'main_category' => 20, 'sub_categories' => array ( array ( 'category_id' => 30, 'category_name' => 'Category 1.4.1', 'main_category' => 26, 'sub_categories' => [] ), array ( 'category_id' => 31, 'category_name' => 'Category 1.4.2', 'main_category' => 26, 'sub_categories' => [] ) ) ), ) ), array ( 'category_id' => 19, 'category_name' => 'Category 2', 'main_category' => 0, 'sub_categories' => [] ) ); function getChildren($data,$parents,&$result){ foreach($data as $current_category){ $temp = []; $temp['category_id'] = $current_category['category_id']; $new_cat_sequence = array_merge($parents,[$current_category['category_name']]); $temp['category_name'] = implode(" -> ",$new_cat_sequence); $result[] = $temp; getChildren($current_category['sub_categories'],$new_cat_sequence,$result); } } $result = []; getChildren($data,[],$result); print_r($result);
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.33, 8.2.0 - 8.2.29, 8.3.0 - 8.3.27, 8.4.1 - 8.4.14
Array ( [0] => Array ( [category_id] => 20 [category_name] => Category 1 ) [1] => Array ( [category_id] => 25 [category_name] => Category 1 -> Category 1.3 ) [2] => Array ( [category_id] => 26 [category_name] => Category 1 -> Category 1.4 ) [3] => Array ( [category_id] => 30 [category_name] => Category 1 -> Category 1.4 -> Category 1.4.1 ) [4] => Array ( [category_id] => 31 [category_name] => Category 1 -> Category 1.4 -> Category 1.4.2 ) [5] => Array ( [category_id] => 19 [category_name] => Category 2 ) )

preferences:
181.87 ms | 409 KiB | 5 Q