2011-05-26 22 views
7

我在由icio和ftrotter的很好的例子產生PHP多維數組(我在陣列中的變體使用ftrotterrs陣列):PHP多維數組無序列表,建立URL路徑

Turn database result into array

我把這個做成了一個無序列表的寬度這個方法:

public function outputCategories($categories, $startingLevel = 0) 
{ 
    echo "<ul>\n"; 
    foreach ($categories as $key => $category) 
    { 
    if (count($category['children']) > 0) 
    { 
     echo "<li>{$category['menu_nl']}\n"; 
     $this->outputCategories($category['children'], $link 
           , $start, $startingLevel+1); 
     echo "</li>\n"; 
    } 
    else 
    { 
     echo "<li>{$category['menu_nl']}</li>\n"; 
    } 
    } 
    echo "</ul>\n"; 
} 

到目前爲止好。

現在我想使用url_nl字段來構建用作菜單中鏈接的url。 url必須通過爲樹中每一步添加/ url_nl來反映de樹中鏈接的部分。

我的目標:

- item 1 (has link: /item_1) 
    * subitem 1 (has link: /item_1/subitem_1) 
    * subitem 2 (has link: /item_1/subitem_1) 
     * subsubitem 1 (has link: /item_1/subitem_2/subsubitem_1) 
- item 2 (has link: /item_2) 

id 
id1 (parent id) 
menu_nl 
url_nl 
title_nl 
etc 

我到目前爲止有:

public function outputCategories($categories, $link, $start, $startingLevel = 0) 
{ 
    // if start not exists 
    if(!$start) 
    $start = $startingLevel; 

    echo "<ul>\n"; 
    foreach ($categories as $key => $category) 
    { 
    $link.= "/".$category['url_nl']; 

    if($start != $startingLevel) 
     $link = strrchr($link, '/'); 

    if (count($category['children']) > 0) 
    { 
     echo "<li>".$start." - ".$startingLevel. 
      "<a href='$link'>{$category['menu_nl']}</a> ($link)\n"; 
     $this->outputCategories($category['children'], $link 
           , $start, $startingLevel+1); 
     echo "</li>\n"; 
    } 
    else 
    { 
     $start = $startingLevel+1; 
     echo "<li>".$start." - ".$startingLevel. 
      "<a href='$link'>{$category['menu_nl']}</a> ($link)</li>\n"; 
    } 
    } 
    echo "</ul>\n"; 
} 

正如你看到的例子我使用了一個url_nl場是遞歸添加,因此列表的每個級別都有一個用作url的路徑鏈接。

無論如何,我建立這些鏈接時遇到問題,因爲它們在循環到分層列表時沒有正確重置。在去名單中的孩子後,第一個是正確的,但第二個沒有。

我困在這裏...

+0

您可能想用if(!isset($ start))替換'if(!$ start)'。 – Johan 2011-05-26 11:21:06

+0

好的建議! – Klaaz 2011-05-27 10:59:56

回答

1

看起來你修改foreach循環裏面的$鏈接變量,所以你物品1添加到$鏈接,環通其子項,並返回到第一次迭代,並添加ITEM2的變量...

替換此

$link .= "/".$category['url_nl']; 

$insidelink = $link . "/".$category['url_nl']; 

(並將循環內的剩餘$鏈接更改爲$內部鏈接)

添加:對於$ startingLevel也是如此。不要修改它,使用+1在線:

echo "<li>".$start." - ".$startingLevel +1. 
    "<a href='$link'>{$category['menu_nl']}</a> ($link)</li>\n"; 
+0

我很快就改變了,因爲我現在必須馬上去。看起來不錯!清晰的思維是這裏的解決方案,我的思想有點困擾,我想!謝謝! – Klaaz 2011-05-26 11:38:09

1

這裏有一個簡單的方法:

$ inarray =您的多維數組在這裏。我使用codeigniter中的directory_map來獲取目錄的內容,包括它的子目錄。

$this->getList($filelist2, $filelist); 
foreach ($filelist as $key => $val) { 
    echo $val; 
} 

function getList($inarray, &$filelist, $prefix='') { 
    foreach ($inarray as $inkey => $inval) { 
     if (is_array($inval)) { 
      $filelist = $this->getList($inval, $filelist, $inkey); 
     } else { 
      if ($prefix) 
       $filelist[] = $prefix . '--' . $inval; 
      else 
       $filelist[] = $inval; 
     } 
    } 

    return $filelist; 
}