簡體   English   中英

代碼分離悖論:從多維數組創建HTML樹並將HTML保留在遞歸函數之外

[英]Code Separation Paradox: Create HTML Tree from Multi-Dimensional Array AND Keep the HTML Outside of the Recursive Function

此工作代碼似乎是解決此問題的典型方法。

它采用一個多維數組,該數組包含類別及其子類別(對它深入的層次沒有隱含限制),並從中創建一個HTML無序列表,並將其從遞歸函數內部回顯到頁面上。

通過從名為_category_list()_的原始回調函數內部,將每個數組元素的“子級”鍵的值遞歸傳遞給array_walk()來遍歷子級別。

如何修改此輸出方法,以使所有HTML代碼都存在於函數外部的模板中?

這是代碼的摘要:

該多維數組包含多級類別樹。

在HTML中使用的重要鍵是'category_id','name'和'children'。 為了簡化起見,其他鍵已從下面的數組中清除,但如果有用,它們是:“ parent_id”和“ level”(從1級開始)。

<?php

// the array containing the tree
$categories = array (
  'category_id' => '2',
  'name' => 'Top Category Name',
  'children' => array (
    0 => array (
      'category_id' => '188',
      'name' => 'Category Name',
      'children' => array (
        0 => array (
          'category_id' => '159',
          'name' => 'Category Name',
          'children' => array (),
        ),
        1 => array (
          'category_id' => '160',
          'name' => 'Category Name',
          'children' => array (),
        ),
        2 => array (
          'category_id' => '166',
          'name' => 'Category Name',
          'children' => array (),
        ),
      ),
    ),
    1 => array (
      'category_id' => '4',
      'name' => 'Category Name',
      'children' => array (
        0 => array (
          'category_id' => '141',
          'name' => 'Category Name',
          'children' => array (),
        ),
        1 => array (
          'category_id' => '142',
          'name' => 'Category Name',
          'children' => array (),
        ),
      ),
    ),
  ),
)

?>

下一個函數產生大多數HTML輸出,但將HTML鎖定在其內部。

但是,我不是在直接從函數中回顯它,而是在尋找一種方法,以一種便於設計人員進行自定義的方式將該數據傳遞回視圖模板。

<?php

// separate the HTML from this function,
// passing $v to the view template for handling
function category_list($v, $k){
  switch ($k) {
    case 'category_id':
      echo "<li id="$v">";
      break;
    case 'name':
      echo "$v";
      break;
    case 'children':
      if(count($v) > 0){
        echo "<ul>";
        foreach($v as $k=>$v)
        array_walk($v, 'category_list');
        echo "</ul>";
      }
      echo "</li>";
      break;
  }
}

?>

下一個代碼塊是當前模板html / php,該調用通過array_walk()遍歷數組的第一級並引用上面的遞歸函數。 然后,函數本身將處理具有1個或多個子級的更深類別的遞歸和迭代。 當然,這是典型的方法。

此代碼應具有所有HTML標簽,而不僅僅是外部標簽。

<ul>
<?php array_walk($tree,'category_list'); ?>
</ul>

理想的解決方案:

這里的最終目標是找到一種模板設計人員創建理想的導航結構的方法,而不必創建或修改遞歸函數(無法訪問),也不需要為多維的每個級別使用foreach循環陣列。 該解決方案不應與任何特定的深度限制相關聯。

HTML自定義的示例范圍包括在ul / li標記內放置其他屬性,甚至在輸出文本周圍包裹新的標記,例如span標記,這些標記通常在導航中用於實現CSS的滑門效果。 因此,我認為適當的解決方案至少需要支持這些案例。

只要可以以回調函數將所需的變量傳遞回模板以供設計人員的HTML使用的方式使用,就可以使用array_walk()在模板上遍歷數組。

理想情況下,如果array_walk_recursive()知道其迭代器實際上有多少級,我認為這一壯舉將更容易解決。 但是,除非有人知道該問題的解決方法,否則解決方案可能會完全不同。

我也想避免使用JavaScript方法來構建樹。 如果有避免使用該開關的方法,我也樂於接受建議。

您是否想過編寫一個類來管理和存儲要傳遞回的信息。 您的函數可以更改該類的實例,並最終將填充的對象傳回。

您的內容將被封裝在類中,並且您可以編寫所有方法和實用程序以供用戶操縱和輸出數據。 實用程序方法也可以寫在類內部以顯示級別數等。

我還沒有親自嘗試過,但是這是我將要開始的地方,因為Class允許我根據用戶想要的內容進行完善和擴展,而他們不需要知道正在發生的事情的內部細節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM