2014-04-27 153 views
0

不幸的是,我爲涉及遞歸的任何事情而苦惱,而且這個問題也沒有什麼不同。通過多維PHP陣列遞歸以生成HTML列表

我在PHP數組中有一個類別結構。我已經通過父類這樣的分組,但如果解決工作的需要,我會很樂意改變:

array(5) { 
    [0] => array(4) { 
    [50] => array(5) { 
     ["category_id"] => int(50) 
     ["category_title"] => string(29) "Category 50" 
     ["parent_category_id"] => int(0) 
     ["display_order"] => int(0) 
     ["depth"] => int(0) 
    } 
    [1] => array(5) { 
     ["category_id"] => int(1) 
     ["category_title"] => string(24) "Category 1" 
     ["parent_category_id"] => int(0) 
     ["display_order"] => int(1) 
     ["depth"] => int(0) 
    } 
    [80] => array(5) { 
     ["category_id"] => int(80) 
     ["category_title"] => string(27) "Category 80" 
     ["parent_category_id"] => int(0) 
     ["display_order"] => int(1) 
     ["depth"] => int(0) 
    } 
    [10] => array(5) { 
     ["category_id"] => int(10) 
     ["category_title"] => string(29) "Category 10" 
     ["parent_category_id"] => int(0) 
     ["display_order"] => int(10) 
     ["depth"] => int(0) 
    } 
    } 
    [1] => array(1) { 
    [2] => array(5) { 
     ["category_id"] => int(2) 
     ["category_title"] => string(21) "Category 2" 
     ["parent_category_id"] => int(1) 
     ["display_order"] => int(1) 
     ["depth"] => int(1) 
    } 
    } 
    [30] => array(1) { 
    [90] => array(5) { 
     ["category_id"] => int(90) 
     ["category_title"] => string(11) "Category 90" 
     ["parent_category_id"] => int(30) 
     ["display_order"] => int(1) 
     ["depth"] => int(2) 
    } 
    } 
    [10] => array(2) { 
    [20] => array(5) { 
     ["category_id"] => int(20) 
     ["category_title"] => string(21) "Category 20" 
     ["parent_category_id"] => int(10) 
     ["display_order"] => int(10) 
     ["depth"] => int(1) 
    } 
    [30] => array(5) { 
     ["category_id"] => int(30) 
     ["category_title"] => string(17) "Category 30" 
     ["parent_category_id"] => int(10) 
     ["display_order"] => int(20) 
     ["depth"] => int(1) 
    } 
    } 
    [50] => array(3) { 
    [40] => array(5) { 
     ["category_id"] => int(40) 
     ["category_title"] => string(6) "Category 40" 
     ["parent_category_id"] => int(50) 
     ["display_order"] => int(1000) 
     ["depth"] => int(1) 
    } 
    [60] => array(5) { 
     ["category_id"] => int(60) 
     ["category_title"] => string(6) "Category 60" 
     ["parent_category_id"] => int(50) 
     ["display_order"] => int(2000) 
     ["depth"] => int(1) 
    } 
    [70] => array(5) { 
     ["category_id"] => int(70) 
     ["category_title"] => string(17) "Category 70" 
     ["parent_category_id"] => int(50) 
     ["display_order"] => int(3000) 
     ["depth"] => int(1) 
    } 
} 

所以HTML的最終結果應該是這樣的:

<ul> 
    <li>Category 50</li> 
    <ul> 
     <li>Category 40</li> 
     <li>Category 60</li> 
     <li>Category 70</li> 
    </ul> 
    <li>Category 1</li> 
    <ul> 
     <li>Category 2</li> 
    </ul> 
    <li>Category 80</li> 
    <li>Category 10</li> 
    <ul> 
     <li>Category 20</li> 
     <li>Category 30</li> 
     <ul> 
      <li>Category 90</li> 
     </ul> 
    </ul> 
</ul> 

請注意,可能存在多層嵌套。

儘管沒有在上面的例子中描述,但是能夠爲每個列表項目使用不僅僅是'category_title'會有用(還有一些其他參數未顯示,例如已經刪除的計數和其他統計信息簡單)。

我非常感激你甚至已經閱讀了這一點。任何建議感激地收到。

最終結果HTML的

可視化表示:

我期待將其轉換成HTML列表如下:

  • 類別50
    • 類別40
    • 類別60
    • 類別70
  • 類別1
    • 類別2
  • 分類80
  • 類別10
    • 類別20
    • 類別30
      • 類別90

回答

1

這應該工作。請注意,這是一個未經測試的腳本:

function recursiveList($array) { 
    echo '<ul>'; 
    foreach ($array as $key => $value) { 
     if (is_array($value) && !isset($value['category_id'])) { // if isset fails means that there is an array containing other categories arrays 
      recursiveList($value); 
     } 
     echo '<li>' . $value['category_title'] . '</li>'; 
    } 
    echo '</ul>'; 
} 

recursiveList($categories); 
+0

謝謝你的回答。它現在不像預期的那樣工作,但是這可能取決於數組的構造方式(按父類別分組)。我會做一些更多的測試。謝謝。 – SpongeBobPHPPants