Как создать вложенный массив PHP из простого многомерного массива

У меня есть массив PHP следующим образом

Array ( [1] => Array ( [id] => 1 [name] => Main Category [parent_id] => null ) [2] => Array ( [id] => 2 [name] => sub category [parent_id] => 1 ) [3] => Array ( [id] => 3 [name] => child category [parent_id] => 2 ) [4] => Array ( [id] => 4 [name] => Main category 1 [parent_id] => null ) [5] => Array ( [id] => 5 [name] => sub category 1 [parent_id] => 4 ) [6] => Array ( [id] => 6 [name] => child category 1 [parent_id] => 5 ) ) 

и я хочу, чтобы этот массив был преобразован, как показано ниже, используя PHP

 $categories = array( array( 'id' => 1, 'Name' => "Main Category", 'sub' => array( id => 2, 'Name' => 'Sub Category', 'sub' => array( 'id' => 3, 'Name' => 'Child category', 'sub' => 'None', ) ) ), array( 'id' => 4, 'Name' => "Main Category 1", 'sub' => array( id => 5, 'Name' => 'Sub Category 1', 'sub' => array( 'id' => 6, 'Name' => 'Child category 1', 'sub' => 'None', ) ) ) ); 

На самом деле у меня есть иерархия списка из 3 уровней, которая выглядит примерно так:

 A 1 level B 2 level under A C 2 level under A D level 3 under C E 1 level F 1 level G 2 level under F 

Если предоставленной информации недостаточно, задайте мне любой вопрос в комментарии. Итак, окончательный результат для моего приведенного примера будет выглядеть ниже

Основная категория дочерней категории

Основная категория 1 подкатегория 2 категория детей 3

Вот что я пробовал.

 foreach ($categoryList as $key => $value) { if ($value->getCategoryId()!=1) { $category[$key]['id'] = $value->getCategoryId(); $category[$key]['name'] = $value->getName(); // $category[$key]['parent_id'] = $value->getParentCategoryIds(); $category[$key]['sub'] = $this->createSubCategoryArray($value->getCategoryId(), $categoryList); } } public function createSubCategoryArray($parentCatId, $categoryList) { foreach ($categoryList as $key => $category) { if($category->getCategoryId() == $parentCatId && $category->getCategoryId()!=1){ echo "string"; return array( 'id' => $category->getCategoryId(), 'name' => $category->getName(), 'sub' => $this->createSubCategoryArray($category->getCategoryId(), $categoryList) ); } } } 

Вы можете попробовать что-то вроде этого и можете изменить его согласно вашему требованию

 for($i=0;$i<count($arr);$i++){ if( $arr[$i]['parent_id'] == null ){ $data[] = array( 'id' => $arr[$i]['id'], 'Name' => $arr[$i]['name'], 'sub' => array() ); }elseif( $arr[$i]['parent_id'] != null){ for($j=0;$j<count($data);$j++){ if( $data[$j]['id'] == $arr[$i]['parent_id'] ){ $data[$j]['sub'][] = createChild($arr[$i]); }else{ for($k=0;$k<count($data[$j]['sub']);$k++){ if($data[$j]['sub'][$k]['id'] == $arr[$i]['parent_id']){ $data[$j]['sub'][$k]['sub'] = createChild($arr[$i]); } } } } } } function createChild($obj){ return array( 'id' => $obj['id'], 'name' => $obj['name'], 'parent_id' => $obj['parent_id'], 'sub' => array() ); }