2013-08-07 3 views
3

У меня есть массив как это:PHP создать многомерный массив из плоских один

<?php 
    $array = array(0 => 'foo', 1 => 'bar', ..., x => 'foobar'); 
?> 

что это самый быстрый способ создать многомерный массив из этого, где каждое значение является другой уровень? Итак, я получаю:

array (size=1) 
'foo' => 
    array (size=1) 
    'bar' => 
     ... 
     array (size=1) 
     'x' => 
      array (size=1) 
      0 => string 'foobar' (length=6) 
+0

Возможный дубликат [Создание многомерного массива из строки] (http://stackoverflow.com/questions/1937079/creating-a-multidimensional-array-from-row) –

+0

Кажется, что лучший ответ можно найти здесь: http://stackoverflow.com/questions/8956222/converting-an-single-dimension-array-into-a-multi-dimensional-associated-array, так как есть два парня, которые скопировали их ответ отсюда. Должно быть хорошо. –

+0

нет нет копии мой запрос немного, но другой :) – DarsVaeda

ответ

1
<?php 
$i = count($array)-1; 
$lasta = array($array[$i]); 
$i--;  
while ($i>=0) 
{ 
    $a = array(); 
    $a[$array[$i]] = $lasta; 
    $lasta = $a; 
    $i--; 
} 
?> 

$a является выходом.

+0

Спасибо, что я искал благодарности! – DarsVaeda

0

Что именно вы пытаетесь сделать? Так много массивов размером 1 кажется немного глупым.

вы, вероятно, хотите использовать цикл (ы) Еогеасп с ключом => значение пары

foreach ($array as $k=>$v) { 
    print "key: $k value: $v"; 
} 

Вы могли бы сделать что-то вроде этого, чтобы достигнуть массива вы просили:

$newArray = array(); 
for ($i=count($array)-1; $i>=0; $i--) { 
    $newArray = array($newArray[$i]=>$newArray); 
} 
+0

$ array = array (0 => 'folder', 1 => 'подпапка', ..., x => 'file.txt'); это то, в чем я нуждаюсь, надеюсь, что это более ясно. – DarsVaeda

0

Try это:

$out = array(); 
$cur = &$out; 
foreach ($array as $value) { 
    $cur[$value] = array(); 
    $cur = &$cur[$value]; 
} 
$cur = null; 

print_r($out); 

Схватил его с другого поста.

+0

Как насчет ссылки на сообщение, чтобы я мог дать ему преимущество? – Twifty

0

Я смущен тем, что вы хотите делать с помощью нечисловых клавиш (т. Е. X в вашем примере). Но в любом случае, используя ссылки на массив поможет

$array = array(0 => 'foo', 1 => 'bar', x => 'foobar'); 


$out = array(); 
$curr = &$out; 

foreach ($array as $key => $value) { 
    $curr[$value] = array(); 
    $curr = &$curr[$value]; 
} 

print("In: \n"); 
print_r($array); 
print("Out : \n"); 
print_r($out); 

Печатает

In: 
Array 
(
    [0] => foo 
    [1] => bar 
    [x] => foobar 
) 
Out : 
Array 
(
    [foo] => Array 
     (
      [bar] => Array 
       (
        [foobar] => Array 
         (
         ) 

       ) 

     ) 

) 
+0

благодарит за x x-number (any number) – DarsVaeda

0

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

function expand_arr($arr) 
{ 
    if (empty($arr)) 
     return array(); 

    return array(
     array_shift($arr) => expand_arr($arr) 
    ); 
} 

Ваш вопрос немного неясно, так как в своем первоначальном заявлении вы используете следующее значение в массиве, как следующий шаг вниз является ключевым, а затем в конце вашего примера вы используете оригинальный ключ, единственный ключ в ключе следующего шага.

+0

привет спасибо за ответ, последняя пара ключей - значение действительно трактуется по-разному – DarsVaeda

Смежные вопросы