2017-02-14 2 views
1

Я хотел бы, чтобы создать многомерный массив в PHP из следующих -Генерация многомерного массива из списка строки

- Item 1 
-- Item 1.1 
-- Item 1.2 
--- Item 1.2.1 
--- Item 1.2.2 
---- Item 1.2.2.1 
- Item 2 
- Item 3 
- Item 4 
-- Item 4.1 
-- Item 4.2 

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

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

Структура массива должна быть чем-то вроде ниже свалки -

array(6) { 
    [0]=> 
    string(6) "Item 1" 
    [1]=> 
    array(3) { 
    [0]=> 
    string(8) "Item 1.1" 
    [1]=> 
    string(8) "Item 1.2" 
    [2]=> 
    array(3) { 
     [0]=> 
     string(10) "Item 1.2.1" 
     [1]=> 
     string(10) "Item 1.2.2" 
     [2]=> 
     array(1) { 
     [0]=> 
     string(12) "Item 1.2.2.1" 
     } 
    } 
    } 
    [2]=> 
    string(6) "Item 2" 
    [3]=> 
    string(6) "Item 3" 
    [4]=> 
    string(6) "Item 4" 
    [5]=> 
    array(2) { 
    [0]=> 
    string(8) "Item 4.1" 
    [1]=> 
    string(8) "Item 4.2" 
    } 
} 

Надеется, что вы можете помочь.

+0

https://www.google.com/search?q=build+multidimensional+array+from+string+recursion // большинство результатов, похоже, для PHP, но поскольку вы даже не упоминали или не отмечали конкретный язык, который должен будет сделать, я думаю. – CBroe

+0

@ CBroe благодарит за ссылку Google. Это PHP - жаль, что я забыл включить это, поэтому добавил его сейчас. Это немного сложнее, чем стандартная рекурсия строк. – Chris

+0

Из комментариев выше, можете ли вы дать понять, как должен выглядеть массив? –

ответ

2

Далее будет конвертировать прямо в HTML без рекурсии:

$text = array(); 
$text[] = '- Item 1'; 
$text[] = '-- Item 1.1'; 
$text[] = '-- Item 1.2'; 
$text[] = '--- Item 1.2.1'; 
$text[] = '--- Item 1.2.2'; 
$text[] = '---- Item 1.2.2.1'; 
$text[] = '- Item 2'; 
$text[] = '- Item 3'; 
$text[] = '- Item 4'; 
$text[] = '-- Item 4.1'; 
$text[] = '-- Item 4.2'; 

$previous_dash_count = 0; // topmost parent 
foreach ($text as $line) { 
    if (preg_match('/(^\-+)(.*)/', $line, $matches, PREG_OFFSET_CAPTURE)===1) { 
     $dash_count = strlen($matches[1][0]); 
     $title = $matches[2][0]; 

     if ($dash_count == $previous_dash_count) { 
      echo "<li>$title</li>\n"; 
     } elseif ($dash_count > $previous_dash_count) { 
      echo str_repeat("<ul>\n", $dash_count - $previous_dash_count); 
      echo "<li>$title</li>\n"; 
     } else { 
      echo str_repeat("</ul>\n",$previous_dash_count-$dash_count+1); 
      echo "<ul>\n"; 
      echo "<li>$title</li>\n"; 
     } 

     $previous_dash_count = $dash_count; 
    } 
} 
echo str_repeat("</ul>\n",$previous_dash_count); 

я сделать несколько предположений. То, что входной текст всегда ведет себя хорошо и не содержит случайности. Также я не предполагаю текст UTF-8, но вы в безопасности с тире.

Вот версия массива во всей своей окровавленной славе:

$stack = array(); 
$previous_dash_count = 0; 
$parent_node = array(); 
foreach ($text as $line) { 
    if (preg_match('/(^\-+)(.*)/', $line, $matches, PREG_OFFSET_CAPTURE)===1) { 
     $dash_count = strlen($matches[1][0]); 
     $title = $matches[2][0]; 

     if ($dash_count == $previous_dash_count) { 
      $parent_node[] = $title; 
     } elseif ($dash_count > $previous_dash_count) { 
      for ($push_count = $previous_dash_count; $push_count<$dash_count; $push_count++) { 
       array_push($stack, $parent_node); // remember node 
       $new_child = array(); 
       $new_child[] = $title; 
       $parent_node[] = $new_child; 
       $parent_node = $new_child; 
      } 
     } else { 
      for ($pop_count = $previous_dash_count; $pop_count >$dash_count; $pop_count--) { 
       $old_child = $parent_node; 
       $parent_node = array_pop($stack); 
       $parent_node[] = $old_child; 
      } 
      $parent_node[] = $title; 
     } 

     $previous_dash_count = $dash_count; 
    } 
} 
for ($pop_count = $previous_dash_count; $pop_count > 0; $pop_count--) { 
    $old_child = $parent_node; 
    $parent_node = array_pop($stack); 
    $parent_node[] = $old_child; 
} 

print_r($parent_node); 

Мы храним стек узлов решетки, поэтому у нас есть связь между ребенком и его родителем. Обратите внимание, что структура этого кода идентична структуре прямой HTML-версии.

+0

Спасибо - мне пришлось в конце концов пойти на этот метод, поскольку он был самым простым. Немного другая техника, но ваш ответ прав, тем не менее. Ура! – Chris

+0

Удивительная версия массива тоже, большое вам спасибо! Cudos :) – Chris

+0

Рад помочь. Это было тяжелее, чем я думал, это заставило меня попотеть ... –