2015-04-16 46 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"; 

那麼就應該之後是這個樣子