gpt4 book ai didi

php - 代码分离悖论 : Create HTML Tree from Multi-Dimensional Array AND Keep the HTML Outside of the Recursive Function

转载 作者:行者123 更新时间:2023-11-28 02:18:56 24 4
gpt4 key购买 nike

这个工作代码似乎是这个问题的典型解决方案。

它采用一个包含类别及其子类别的多维数组(对其深度的层级没有隐含的限制)并从中创建一个 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 锁定在自身内部。

但是,我没有直接从函数中回显它,而是在寻找一种方法,以一种便于设计人员自定义的方式将此数据传递回 View 模板。

<?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 实现滑动门效果.因此,我认为合适的解决方案至少需要支持这些案例场景。

使用 array_walk() 从模板遍历数组仍然没问题,只要它的使用方式能够使回调函数将所需的变量传递回模板以用于设计人员的 HTML。

理想情况下,如果 array_walk_recursive() 知道它的迭代器实际上有多少层级,我认为这个壮举会更容易解决。但除非有人知道解决该问题的方法,否则解决方案可能会完全不同。

我还想避免使用 javascript 方法来构建树。如果有办法避免使用开关,我也乐于接受建议。

最佳答案

您是否考虑过编写一个类来管理和存储您要传回的信息。您的函数可以改变该类的实例,并最终传回填充的对象。

您的内容将被封装在类中,您可以编写所有方法和实用程序供用户操作和输出数据。实用方法也可以写在类内部,用于展示关卡数量等。

我自己还没有尝试过,但这是我要开始的地方,因为类允许我改进和扩展我的用户想要什么,他们不需要知道正在发生的事情的内部细节。

关于php - 代码分离悖论 : Create HTML Tree from Multi-Dimensional Array AND Keep the HTML Outside of the Recursive Function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/893879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com