I have a multi-dimensional array:
Array ( [0] => Array ( [category_id] => 20 [category_name] => Category 1 [main_category] => 0 [sub_categories] => Array ( [0] => Array ( [category_id] => 25 [category_name] => Category 1.3 [main_category] => 20 [sub_categories] => ) [1] => Array ( [category_id] => 26 [category_name] => Category 1.4 [main_category] => 20 [sub_categories] => Array ( [0] => Array ( [category_id] => 30 [category_name] => Category 1.4.1 [main_category] => 26 [sub_categories] => ) [1] => Array ( [category_id] => 31 [category_name] => Category 1.4.2 [main_category] => 26 [sub_categories] => ) ) ) [1] => Array ( [category_id] => 19 [category_name] => Category 2 [main_category] => 0 [sub_categories] => ) )
Would become:
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 ) )
You can loop over all data in a recursive manner. While doing so, pass all ancestors to the next level children and add all of them to a new variable, say $result
and print them in the end.
Snippet:
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);
}
}
Demo: https://3v4l.org/QN4NP