2015-04-16 48 views
1

我使用以下函数将标签列表转换为数组,但深度为1的标签添加到数组[1]中;为什么深度为1的行添加到数组[1]

选项卡列表:

$test = "Test 
     Sub Item Test 1 (Test) 
     Sub Item Test 2 (Test) 
       Sub Sub Item Test 1 (Sub Item Test 2) 
      Sub Sub Sub Item Test 1 (Sub Item Test 2) 
    Test 2 
     Sub Item Test 1 (Test 2) 
    Test 3 
     Sub Item Test 1 (Test 3) 
    Test 4 
     Sub Item Test 1 (Test 4) 
    Test 5 
     Sub Item Test 1 (Test 5)"; 

功能:

function convert($list, $indent = "\t") { 

     $main   = array(); 

     foreach (explode(PHP_EOL, $list) as $line) { 
      $depth = substr_count($line, $indent); 
      $line = trim($line); 
      if ($line == '') { 
       continue; 
      } 

      $a = &buildArray($main, $depth, 0, $line); 
      $a[$i++] = $line; 
     } 

     return $main; 

    } 

    function &buildArray(&$array, $depth, $current = 0, $line = null) { 

     if ($depth == $current) { 
      return $array; 
     } else { 
      foreach ($array as &$value) { 
       if (is_array($value)) { 
        return buildArray($value, $depth, ++ $current); 
       } 
      } 

      $tmp = array(); 
      $array[] = &$tmp; 

      return buildArray($tmp, $depth, ++ $current); 
     } 
    } 

这里是运行 “转换($测试)”

Array 
    (
     [0] => Test 
     [1] => Array 
      (
       [1] => Sub Item Test 1 (Test) 
       [2] => Sub Item Test 2 (Test) 
       [3] => Array 
        (
         [0] => Array 
          (
           [3] => Sub Sub Item Test 1 (Sub Item Test 2) 
          ) 

         [4] => Sub Sub Sub Item Test 1 (Sub Item Test 2) 
        ) 

       [6] => Sub Item Test 1 (Test 2) 
       [8] => Sub Item Test 1 (Test 3) 
       [10] => Sub Item Test 1 (Test 4) 
       [12] => Sub Item Test 1 (Test 5) 
      ) 

     [5] => Test 2 
     [7] => Test 3 
     [9] => Test 4 
     [11] => Test 5 
    ) 

那么为什么会后的结果数组[1] [6]而不是数组[6],对于数组[5]之后的所有行,依此类推?

回答

1

我认为如果你重新设计你将如何存储数据应该会更容易。我的建议是,为每个级别创建一个数组,其中包含标签的关键字和子平面的另一个关键点。

Array (
    [0] => Array (
     ['label'] => Test 1 
     ['children'] => array(
      [0] => Array (
       ['label'] => Sub Item Test 1 (Test 1) 
       ['children'] => array() 
      ) 
      [1] => Array (
       ['label'] => Sub Item Test 2 (Test 1) 
       ['children'] => array(
        [0] => Array (
         ['label'] => Sub Sub Item Test 1 (Sub Item Test 2) 
         ['children'] => array() 
        ) 
        [1] => Array (
         ['label'] => Sub Sub Item Test 2 (Sub Item Test 2) 
         ['children'] => array() 
        ) 
       ) 
      ) 
      [2] => Array (
       ['label'] => Sub Item Test 3 (Test 1) 
       ['children'] => array() 
      ) 
     ) 
    [1] => Array (
     ['label'] => Test 2 
     ['children'] => array(
      [0] => Array (
       ['label'] => Sub Item Test 1 (Test 2) 
       ['children'] => array() 
      ) 
      [1] => Array (
       ['label'] => Sub Item Test 2 (Test 2) 
       ['children'] => array() 
      ) 
      [2] => Array (
       ['label'] => Sub Item Test 3 (Test 2) 
       ['children'] => array() 
      ) 
      [3] => Array (
       ['label'] => Sub Item Test 4 (Test 2) 
       ['children'] => array(
        [0] => Array (
         ['label'] => Sub Sub Item Test 4 (Sub Item Test 4) 
         ['children'] => array() 
        ) 
        [1] => Array (
         ['label'] => Sub Sub Item Test 4 (Sub Item Test 4) 
         ['children'] => array() 
        ) 
       ) 
      ) 
     ) 
    ) 
) 

$test = "Test 1\n 
\tSub Item Test 1 
\t\tSub Sub Item Test 1 
\t\tSub Sub Item Test 2 
\tSub Item Test 2 
\tSub Item Test 3 
\tSub Item Test 4 
Test 2\n 
\tSub Item Test 1 
\tSub Item Test 2 
\tSub Item Test 3 
\tSub Item Test 4 
\t\tSub Sub Item Test 1 
\t\tSub Sub Item Test 2"; 

那么就应该之后是这个样子