2011-07-25 25 views
5

我使用下面的stackoverflow thread,這在創建排序的多級父 - >子數組時非常有幫助。使用多級父 - >子數組創建單個SELECT

的下面是一個示例的多級(3級)父 - >基於該上述線程的排序方法排序的子陣列:我想採取排序後的數組

Array 
( 
    [1] => Array 
     ( 
      [name] => User Manual 
      [parentId] => 0 
      [children] => Array 
       ( 
        [2] => Array 
         ( 
          [name] => Users 
          [parentId] => 1 
          [children] => Array 
           ( 
            [4] => Array 
             ( 
              [name] => Privileges 
              [parentId] => 2 
             ) 
           ) 
         ) 
        [3] => Array 
         ( 
          [name] => Reference 
          [parentId] => 1 
          [children] => Array 
           ( 
            [5] => Array 
             ( 
              [name] => Glossary 
              [parentId] => 3 
             ) 
            [6] => Array 
             ( 
              [name] => Index 
              [parentId] => 3 
             ) 
           ) 
         ) 
       ) 
     ) 
) 

現在並生成單個 HTML選擇顯示和表示父 - >子結構,如下面的例子:

<option value='1'>User Manual</option> 
<option value='2'>User Manual -> Users</option> 
<option value='4'>User Manual -> Users -> Privileges</option> 
<option value='3'>User Manual -> Reference</option> 
<option value='5'>User Manual -> Reference -> Glossary</option> 
<option value='6'>User Manual -> Reference -> Index</option> 

如上面看到的目標是編譯表示多層次的父/子顯示字符串路徑爲每個項目。每個選項的值是表示的編譯字符串中的最後一項。因此,對於OPTION'用戶手冊 - >用戶 - >權限',VALUE是特權的ID,但顯示文本表示它在數組中的父/子關係。

的選擇,我創建最終總是顯示像下面的選項列表:

<option value='1'>User Manual</option> 
<option value='2'>User Manual -> Users</option> 
<option value='4'>Users -> Privileges</option> 
<option value='3'>User Manual -> Reference</option> 
<option value='5'>Reference -> Glossary</option> 
<option value='6'>Reference -> Index</option> 

你可以看到,它只是能夠保持父/子關係的一個水平的軌道。

我的函數處理數組創建選擇選項列表如下:

function buildOptions($arr, $target, $parent = NULL) { 
    $html = ""; 
    foreach ($arr as $key => $v) 
    { 
    if (array_key_exists('children', $v)) 
    { 
     if ($key == $target) 
     $html .= "<option value='$key' selected>$parent {$v['name']}</option>\n"; 
     else 
     $html .= "<option value='$key'>$parent {$v['name']}</option>\n"; 

     $html .= buildOptions($v['children'],$target,$v['name']." > "); 
    } 
    else if ($key == $target) 
     $html .= "<option value='$key' selected>$parent {$v['name']}</option>\n"; 
    else 
     $html .= "<option value='$key'>$parent {$v['name']}</option>\n"; 

    } 

    return $html; 
} 
我有在跟蹤以前的X parent.name的時候有一個以上的水平麻煩

。任何幫助在這裏都會受到歡迎。謝謝!

+2

什麼是您的陣列是什麼樣子?聞起來像遞歸可能會涉及到。 –

+0

你的權利,我使用遞歸來顯示2級,所以我的問題是保留樹結構歷史兩級。問題是遞歸通過預先排序的數組。它自然而然地處理每個孩子以及孩子進步的過程。所以當它回到以前的孩子時,我很難將字符串逐步回退。希望這是有道理的。我將用數組示例更新我的帖子。 – Brad

+0

@Brad:您的代碼段中沒有遞歸調用。什麼是「toUL」?什麼是'$ target'?你會考慮使用視覺線索(縮進),而不是重複表達層次結構的完整路徑嗎? –

回答

3

解決您的遞歸調用這種方式,你應該得到每個節點上完整的層次:

function buildOptions($arr, $target, $parent = NULL) { 
    $html = ""; 
    foreach ($arr as $key => $v) 
    { 
    if ($key == $target) 
     $html .= "<option value='$key' selected>$parent {$v['name']}</option>\n"; 
    else 
     $html .= "<option value='$key'>$parent {$v['name']}</option>\n"; 

    if (array_key_exists('children', $v)) 
     $html .= buildOptions($v['children'],$target,$parent . $v['name']." > "); 
    } 

    return $html; 
} 
+0

謝謝!我無法相信我那麼接近。人......我可以發誓我嘗試過。太多的小時,盯着同樣的問題,我認爲。 – Brad

+0

我無法發佈我自己的答案,但作爲後續,但我稍微修改了你的回答,以檢查是否(!$ parent)然後只打印$ v ['name']。「 - >」,否則打印$ parent。 $ v [ '名']。「 - >」。 – Brad

+1

只需要注意一下:如果我在一個問題上盯上太多時間,我就站起來走開......也許會在外面嗅到一些新鮮空氣。 1-2小時後,我通常在10分鐘內解決問題。這對我有效。 :) –

相關問題