Подтвердить что ты не робот

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"))))))
4b9b3361

Ответ 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);