2014-01-11 77 views
2

創建多級有序列表我一直想有一段時間在PHP中創建一個多層次的有序列表了。我嘗試過並一直在尋找,我看到的所有數據佈局都不同於我必須使用的數據佈局。大多數示例都會從數據庫中提取數據,並根據單獨的列構建數組,並且在這種情況下會生成具有深度或父母關係信息的列。我的數據是在一個SSRS報告路徑和2至3(或更多的未來)可以改變的水平,所以我不知道如何來構建陣列,以在這個問題上的功能工作。有困難動態

例如,一個例子是來自另一個帖子 - generating-category-tree-as-html-unordered-list,但是所有例子和我所擁有的不同之處在於數據本身的性質。

這裏是我的工作全例如:

例陣列和功能

<?php 
    $nested = Array 
    (
     1 => Array ('id' => 1, 'parent' => 0, 'title' => 'Page 1'), 
     2 => Array ('id' => 2, 'parent' => 0, 'title' => 'Page 2'), 
     3 => Array ('id' => 3, 'parent' => 0, 'title' => 'Page 3'), 
     4 => Array ('id' => 4, 'parent' => 0, 'title' => 'Page 4'), 
     5 => Array ('id' => 5, 'parent' => 0, 'title' => 'Page 5'), 
     6 => Array ('id' => 6, 'parent' => 1, 'title' => 'Page 1-1'), 
     7 => Array ('id' => 7, 'parent' => 1, 'title' => 'Page 1-2'), 
     8 => Array ('id' => 8, 'parent' => 1, 'title' => 'Page 1-3'), 
     9 => Array ('id' => 9, 'parent' => 2, 'title' => 'Page 2-1'), 
     10 => Array ('id' => 10, 'parent' => 2, 'title' => 'Page 2-2'), 
     11 => Array ('id' => 11, 'parent' => 2, 'title' => 'Page 2-3'), 
     12 => Array ('id' => 12, 'parent' => 3, 'title' => 'Page 3-1'), 
     13 => Array ('id' => 13, 'parent' => 3, 'title' => 'Page 3-2'), 
     14 => Array ('id' => 14, 'parent' => 4, 'title' => 'Page 4-1'), 
     15 => Array ('id' => 15, 'parent' => 6, 'title' => 'Page 1-1-1'), 
     16 => Array ('id' => 16, 'parent' => 6, 'title' => 'Page 1-1-2'), 
     17 => Array ('id' => 17, 'parent' => 6, 'title' => 'Page 1-1-3'), 
     18 => Array ('id' => 18, 'parent' => 7, 'title' => 'Page 1-2-1'), 
     19 => Array ('id' => 19, 'parent' => 7, 'title' => 'Page 1-2-2'), 
     20 => Array ('id' => 20, 'parent' => 7, 'title' => 'Page 1-2-3'), 
     21 => Array ('id' => 21, 'parent' => 9, 'title' => 'Page 2-1-1'), 
     22 => Array ('id' => 22, 'parent' => 9, 'title' => 'Page 2-1-2'), 
     23 => Array('id' => 23, 'parent' => 12, 'title' => 'Page 2-3-3') 
    ); 


function recursive($parent, $array) { 
    $has_children = false; 
    foreach($array as $key => $value) { 
     if ($value['parent'] == $parent) {  
     if ($has_children === false && $parent) { 
      $has_children = true; 
     echo '<ul>' ."\n"; 
     } 
     echo '<li>' . "\n"; 
     echo '<a href="/page.php?id=' . $value['id'] . '">' . $value['title'] . '</a>' . " \n"; 
     echo "\n"; 
     recursive($key, $array); 
     echo "</li>\n"; 
    } 
     } 
    if ($has_children === true && $parent) echo "</ul>\n"; 
    } 
?> 
<!DOCTYPE HTML> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <title>Untitled Document</title> 
    </head> 
    <body> 
     <ul><?php echo recursive(0, $nested); ?></ul> 
    </body> 
</html> 

下面是數據出了SSRS報表服務器的一個例子。由於數據非常密集,它不適合代碼窗口,所以我不得不堆疊兩列。報告名稱與路徑中的最後一個元素相同,因此它有點多餘。

數據庫數據

PATH 
/Production/Analyst/POS Sales Excel Data Export 
/Production/Analyst/STATS Membership Tracking - RAW 
/Production/Information Technologies/IT Dashboard DUMMY 
/Production/Information Technologies/IT Department 
/Production/Membership/MDash 
/Production/Membership/Membership Dashboard 
/Production/Membership/Membership Reports/Membership Grid 
/Production/Membership/Membership Reports/Membership Grid by SU 
/Production/Membership/Membership Reports/Membership Pie Charts 
/Production/Membership/Membership Reports/Membership Sum Drill Down 
/Production/Membership/Membership Reports/POS Sales By Date and Location 
/Production/Membership/Stats/STATS Council Participation 
/Production/Membership/Stats/STATS Council SU Summary Adults 
/Production/Membership/Stats/STATS Council Summary Adults 
/Production/Membership/Stats/STATS Council Troop Summary Adults 
/Production/Membership/Stats/STATS Lifetime Stats 
/Production/Membership/Stats/STATS Membership Tracking 
/Production/Online Training (LMS)/LMS User ID Lookup 
/Production/Online Training (LMS)/Manager Training 2014 
/Production/Shop/POS Reports/POS Sales By Date and Location 
/Production/Shop/Shop Dashboard DUMMY 
/Production/SLT Dashboard/OLD Dashboard Membership_Overview 

NAME 
POS Sales Excel Data Export 
STATS Membership Tracking - RAW 
IT Dashboard DUMMY 
IT Department 
MDash 
Membership Dashboard 
Membership Grid 
Membership Grid by SU 
Membership Pie Charts 
Membership Sum Drill Down 
POS Sales By Date and Location 
STATS Council Participation 
STATS Council SU Summary Adults 
STATS Council Summary Adults 
STATS Council Troop Summary Adults 
STATS Lifetime Stats 
STATS Membership Tracking 
LMS User ID Lookup 
Manager Training 2014 
POS Sales By Date and Location 
Shop Dashboard DUMMY 
OLD Dashboard Membership_Overview 

這些數據需要需要象下面這樣的格式去與功能工作。該ID與我的目的無關,因爲報告的鏈接與報告名稱相同,因此我必須更改該功能以適合該報告。也就是說,我需要採取上面的路徑,並將其轉換爲下面的數組。

陣列格式需要

$nested2 = Array 
(
1 => Array ('parent' => 0, 'title' => 'Analyst'), 
2 => Array ('parent' => 0, 'title' => 'Membership'), 
3 => Array ('parent' => 0, 'title' => 'SLT Dashboard'), 
4 => Array ('parent' => '1', 'title' => 'POS Sales Excel Data Export'), 
5 => Array ('parent' => '1', 'title' => 'STATS Membership Tracking - RAW'), 
6 => Array ('parent' => '2', 'title' => 'Membership Dashboard'), 
7 => Array ('parent' => '6', 'title' => 'Membership Grid'), 
8 => Array ('parent' => '6', 'title' => 'Membership Grid by Service Unit'), 

);

所以,我的問題是 - 怎麼我的工作將數據轉換成一個這樣的數組?或者,使用不同的東西來創建列表會更好嗎?我知道我可以通過列表迭代,可能需要每個元素比較報告名字就知道在哪裏停止,父母是誰,等等,但在那之後那種迷失方向。

與往常一樣,許多在此先感謝。

回答

0

我寫了一個簡單的解決方案(希望對你有用,你可以修改你的想法)。但我只用一節PATH(做什麼用的部分NAME - 不明白)。

$filename = 'path.txt'; // put section PATH to file for convenience 
$lines = file($filename); 

$tree = array(); 

foreach($lines as $line){ 

    $items = array_filter(explode('/',$line)); 
    $branch = array(); 
    $ptr = &$branch; 
    foreach($items as $item){ 
     $ptr[$item] = Array(); 
     $ptr = &$ptr[$item]; 
    } 
    unset($ptr); 

    if (empty($tree)){ 
     $tree = $branch; 
    }else{ 
     $tree = array_merge_recursive($tree,$branch); 
    } 

} 

// output tree 
echo '<pre>'; 
var_dump($tree); 
echo '</pre>'; 

輸出

array(1) { 

    ["Production"]=> 
     array(6) { 

      ["Analyst"]=> 
       array(2) { 
        ["POS Sales Excel Data Export"]=> array(0) {} 
        ["STATS Membership Tracking - RAW"]=> array(0) {} 
       } 

      ["Information Technologies"]=> 
       array(2) { 
        ["IT Dashboard DUMMY"]=> array(0) {} 
        ["IT Department"]=> array(0) {} 
       } 

      ["Membership"]=> 
       array(4) { 
        ["MDash"]=>array(0) {} 
        ["Membership Dashboard"]=> array(0) {} 
        ["Membership Reports"]=> 
          array(5) { 
           ["Membership Grid"]=> array(0) {} 
           ["Membership Grid by SU"]=> array(0) {} 
           ["Membership Pie Charts"]=> array(0) {} 
           ["Membership Sum Drill Down"]=> array(0) {} 
           ["POS Sales By Date and Location"]=> array(0) {} 
          } 
        ["Stats"]=> 
          array(6) { 
           ["STATS Council Participation"]=> array(0) {} 
           ["STATS Council SU Summary Adults"]=> array(0) {} 
           ["STATS Council Summary Adults"]=> array(0) {} 
           ["STATS Council Troop Summary Adults"]=>array(0) {} 
           ["STATS Lifetime Stats"]=> array(0) {} 
           ["STATS Membership Tracking"]=> array(0) {} 
          } 
        } 

     ["Online Training (LMS)"]=> 
       array(2) { 
        ["LMS User ID Lookup"]=> array(0) {} 
        ["Manager Training 2014"]=> array(0) {} 
        } 

     ["Shop"]=> 
       array(2) { 
        ["POS Reports"]=> 
          array(1) { 
           ["POS Sales By Date and Location"]=> array(0) {} 
          } 
        ["Shop Dashboard DUMMY"]=> array(0) {} 
        } 

     ["SLT Dashboard"]=> 
       array(1) { 
        ["OLD Dashboard Membership_Overview"]=> array(0) {} 
        } 
     } 
} 
+0

感謝 - 這個名字只是數據我是從表中獲取的第二列 - 正如我上面提到的,因爲它是路徑的一部分,它可能是無論如何。 – 43rdworld

+0

對不起 - 不知道有一個評論計時器....我有點看到你在做什麼,但它不適用於該功能,我不知道該怎麼做來改變它。如果我能得到它適合該功能的格式,我可以改變一些東西來處理數據庫。任何關於如何做到這一點的指針? – 43rdworld