2015-12-21 2 views
1

У меня есть массив, содержащий много категорий строк, какРекурсивных создать многомерный массив из строк взрывают

Cars > Model1 
Cars > Model1 > Accessories 
Cars > Model1 > Something 
Cars > Model2 
Cars > Model3 

, который я хочу рекурсивно преобразовать в многомерный массив, где «Тачка» является родительским элементом Model1, model2 и Model3.

И, конечно, «Аксессуары» и «Что-то» были бы дочерними элементами Model1.

пытаются выработать логику этого в течение некоторого времени, и я просто не могу понять это ...

Edit: То, что я до сих пор, это не так много. Как уже упоминалось, не может показаться логикой того, как ее развивать.

$array = array(
     'Cars > Model1', 
     'Cars > Model1 > Accessories', 
     'Cars > Model1 > Something', 
     'Cars > Model2', 
     'Cars > Model3' 
    ); 

    for ($i = 0; $i < count($array); $i++) { 
     $name = explode('>', $array[$i]); 

     // somehow check if the current "name" is already pushed to a new array - if it is, then add as a child. 
    } 
+1

разместить свой код PHP –

+0

Я попытался взрываются «>» и перекручивание через взорванный чтобы вставить это в $ newArray. Но в каждой итерации мне нужно проверить, находится ли это конкретное имя внутри $ newArray, потому что тогда мы не будем добавлять к нему. – dtn

+0

Возможный дубликат [Переменная, содержащая путь в виде строки для многомерного массива?] (Http://stackoverflow.com/questions/3857033/variable-containing-a-path-as-a-string-to-multi- мерный массив) –

ответ

0

Вот как вы можете достичь этого

$array_data = array(
    'Cars > Model1', 
    'Cars > Model1 > Accessories', 
    'Cars > Model1 > Something', 
    'Cars > Model2', 
    'Cars > Model3' 
); 

$last_key = null; 
$array = []; 
$result = []; 
foreach($array_data as $key => $values) 
{ 
    $data = explode('>', $values); 
    if(is_array($data)) 
    { 
    $count = 0; 
    $pop = array_pop($data); 
    foreach($data as $k => $v) 
    { 
     if($count == 1) 
     { 
      unset($result[$last_key]); 
      $result[$last_key][$v] = $pop; 
      $count++; 
      continue; 
     } 
     $last_key = $v; 
     $result[$v] = $pop; 
     $count++; 
    } 
    $array[] = $result; 
    } 
} 

и результат будет что-то вроде

echo '<pre>';print_r($array); 
Array 
(
    [0] => Array 
    (
     [Cars ] => Model1 
    ) 

[1] => Array 
    (
     [Cars ] => Array 
      (
       [ Model1 ] => Accessories 
      ) 
    ) 

[2] => Array 
    (
     [Cars ] => Array 
      (
       [ Model1 ] => Something 
      ) 

    ) 

[3] => Array 
    (
     [Cars ] => Model2 
    ) 

[4] => Array 
    (
     [Cars ] => Model3 
    ) 

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