PHP flat array для вложенных [ "a", "b", "c" ] в [ "a" => [ "b" => [ "c" ]]]
Как видно из названия в примере, мне нужен плоский массив, который будет вложен в следующий следующий ключ, являющийся предыдущим значением.
Пример:
array("I", "need", "this", "to", "be", "nested");
// To:
array("I" => array("need" => array("this" => array("to" => array("be" => array("nested"))))))
Ответы
Ответ 1
Здесь, который просто изменяет исходный массив вместо создания новой переменной с помощью array_walk
:
$a = ["I", "need", "this", "to", "be", "nested"];
array_walk(array_reverse($a), function ($v, $k) use (&$a) {
$a = $k ? [$v => $a] : [$v];
});
Если $a
пусто, это должно просто оставить его пустым. Однако он предполагает, что ваш входной массив имеет ключи, начинающиеся с 0.
Ответ 2
Вот возможная реализация:
<?php
function make_nested($array) {
if (count($array) < 2)
return $array;
$key = array_shift($array);
return array($key => make_nested($array));
}
print_r(make_nested(array("I", "need", "this", "to", "be", "nested")));
Если вам не нравится рекурсия, вот итеративная версия:
function make_nested($array) {
if (!$array)
return array();
$result = array(array_pop($array));
while ($array)
$result = array(array_pop($array) => $result);
return $result;
}
Ответ 3
Использование array_reduce
:
$a = ["I", "need", "this", "to", "be", "nested"];
$result = array_reduce(array_reverse($a), function($prevArray, $key){
return $prevArray ? [$key => $prevArray] : [$key];
}, null);
Обратите внимание, что мы используем array_reverse
, потому что нет левого сокращения.
Рабочий пример: http://ideone.com/N61VtE
Ответ 4
Я бы использовал for
-loop для этого:)
$array = array("I", "need", "this", "to", "be", "nested");
$newArray[$array[count($array)-2]] = array_pop($array);
for($i = count($array) - 2; $i > -1; $i--) {
$newArray[$array[$i]] = $newArray;
unset($newArray[$array[$i+1]]);
}
print_r($newArray);
Ответ 5
Запустить код
<?php
// nested_array(array, start_index, length)
function nested_array($arr, $i, $size)
{
if ($i == ($size-1))
{
return array($arr[$i] => array());
}
return array($arr[$i] => nested_array($arr,($i+1),$size));
}
print_r(nested_array(array("I", "need", "this", "to", "be", "nested"),0,6));
?>
Ответ 6
Кажется, это работает.
$a = array("I", "need", "this", "this", "to", "be", "nested");
$r = array($a[sizeof($a) - 1]);
for ($i=sizeof($a)-2; $i >= 0; $i--) {
$r = array($a[$i] => $r);
}
echo($ar == $r);