我在WP中有一个装满导航菜单项的平坦阵列。每个项目都知道其父母,但他们似乎都不知道他们是否有孩子。
Array
(
[0] => stdClass Object
(
[ID] => 22
[menu_item_parent] => 0
)
[1] => stdClass Object
(
[ID] => 108
[menu_item_parent] => 22
)
[2] => stdClass Object
(
[ID] => 117
[menu_item_parent] => 108
)
[3] => stdClass Object
(
[ID] => 118
[menu_item_parent] => 108
)
[4] => stdClass Object
(
[ID] => 106
[menu_item_parent] => 22
)
[5] => stdClass Object
(
[ID] => 119
[menu_item_parent] => 106
)
[6] => stdClass Object
(
[ID] => 120
[menu_item_parent] => 106
)
[7] => stdClass Object
(
[ID] => 23
[menu_item_parent] => 0
)
)
我尝试通过有条件的逻辑来处理几种不同的方式(并且每次硬编码值并不理想),但我一直将自己编码成一团糟。我如何迭代阵列以产生这样的结果?
<ul>
<li>22
<ul class="child">
<li>108
<ul class="grandchild">
<li>117</li>
<li>118</li>
</ul>
</li>
<li>106
<ul class="grandchild">
<li>119</li>
<li>120</li>
</ul>
</li>
</ul>
</li>
<li>23</li>
</ul>
您需要识别节点的孩子,以便将它们放在所需的结构中。 为此,您需要迭代元素并重组它们。 以下是做什么的粗略代码;未测试
现在,new的数组$现在应该包含带有子节点的元素,您可以迭代这些元素以产生所需的结果。
这是通过循环浏览当前阵列,识别父母及其子节点的工作,并将其组织起来。 将只能深入两个层次;如果您需要更深入地进行,代码可能需要重新加工才能更好地组织。 我想从制作单独的父(主)阵列和子女数组开始(或者我们可以使其成为长的多维数组)
foreach($arr AS $value)
{
if($value->menu_item_parent == 0)
$parentArr[] = $value->ID;
else
$childArr[$value->menu_item_parent][] = $value->ID;
}
A递归功能将有助于获得一些全球解决方案,使孩子和孙子。考虑一下,
必须有一个更好的方法来解决这种问题。
我最终这样做了:
<?php
$items = wp_get_nav_menu_items('primary'); // original flat array
foreach ($items as $item) {
$pages[$item->menu_item_parent][] = $item; // create new array
}
foreach ($pages[0] as $parent) {
if (isset($pages[$parent->ID])) { // if page has children
echo '<li>'.$parent->ID;
echo '<ul class="children">';
foreach ($pages[$parent->ID] as $child) {
if (isset($pages[$child->ID])) { // child has children
echo '<li>'.$child->ID;
echo '<ul class="grandchildren">';
foreach ($pages[$child->ID] as $grandchild) {
echo '<li>'.$grandchild->ID.'</li>';
}
echo '</ul></li>';
} else {
echo '<li>'.$child->ID.'</li>'; // child has no children
}
}
echo '</ul></li>';
} else { // page has no children
echo '<li>'.$parent->ID.'</li>';
}
}
?>