Как преобразовать одномерный массив элементов «N» в «N» уровень вложенного массива в PHP?
Пример:
Входные данные :
$input = array('Orange','Apple','Banana');
Ожидаемый результат:
$output = array( 'name' => 'Banana', 'sub_category' => array( 'name' => 'Apple', 'sub_category' => array( 'name' => 'Orange' );
Это мой код:
$categories = array('Orange','Apple','Banana'); $count = count($categories); for($i=0;$i<=$count;$i++){ if(isset($categories[$i+1])){ $parent = $categories[$i+1]; // parent $categories[$i+1]=array( 'name' => $categories[$i+1], 'sub_category' => array('name' => $categories[$i]) ); } } $categories = $categories[$count-1]; var_dump($categories);
Мой код неаккуратный, и я также получаю следующий неверный вывод:
$output = array( 'name' => 'Banana', 'sub_category' => array( 'name' => array( 'name' => 'Apple', 'sub_category' => array( 'name' => 'Orange' ); );
Изменить 1:
Проблема / решение, представленное здесь , похоже, не отвечает на мой вопрос.
Вы можете использовать простой метод рекурсии:
function toNestedArray(array $input, array $result = []) { $result = ['name' => array_pop($input)]; if (count($input)) { $result['sub_category'] = toNestedArray($input, $result); } return $result; }
$categories = array('Orange','Apple','Banana'); $count = count($categories); $categories2=array(); for($i=$count-1;$i>0;$i--){ if($i-2>-1){ $categories2=array( 'name'=>$categories[$i], 'sub_category'=>array('name'=>$categories[$i-1],'sub_categories'=>array('name'=>$categories[$i-2])) ); } } echo "<pre>"; print_r($categories2); echo "</pre>";
Простой вариант состоит в том, чтобы перебрать массив $input
, построив массив $output
изнутри наружу.
$output = array(); foreach ($input as $name) { if (empty($output)) { $output = array("name" => $name); } else { $output = array("name" => $name, "sub_category" => $output); } }