【问题标题】:From php multidimensional array trying to create nested ul li menu (unlimited nested levels)从 php 多维数组尝试创建嵌套 ul li 菜单(无限嵌套级别)
【发布时间】:2015-07-03 05:16:14
【问题描述】:

这是我得到的http://codepad.org/iDoXXsLX

有这样的数组

Array
(
[0] => Array
    (
        [NumberRenamed] => 17
        [TopicName] => Products
        [UpperLevelNumberRenamed] => 0
    )

[17] => Array
    (
        [0] => Array
            (
                [1] => Array
                    (
                        [NumberRenamed] => 18
                        [TopicName] => Computers
                        [UpperLevelNumberRenamed] => 17
                    )
            )
    )

[18] => Array
    (
        [0] => Array
            (
                [2] => Array
                    (
                        [NumberRenamed] => 16
                        [TopicName] => Laptops
                        [UpperLevelNumberRenamed] => 18
                    )
            )
    )

[16] => Array
    (
        [0] => Array
            (
                [4] => Array
                    (
                        [NumberRenamed] => 8
                        [TopicName] => Dell
                        [UpperLevelNumberRenamed] => 16
                    )
            )
    )
)

顶级项目是Products,第一个子级项目是Computers,下一个子级是Laptops,然后是下一个子级Dell

对于每个子级项UpperLevelNumberRenamed == 到最接近的上级NumberRenamed

想要得到这样的结果

Products
  Computers
    Laptops
      Dell
      Acer
    Desktops
Home

试过了

foreach( $main_topics as $k_main_topics => $v_main_topics ){

if( isset($v_main_topics['UpperLevelNumberRenamed']) and $v_main_topics['UpperLevelNumberRenamed'] == 0 ){
//print only top level topics
echo $v_main_topics['TopicName']. '<br/>';
}

else{//if not top level topic

foreach( $v_main_topics[0] as $k_v_main_topics_0 => $v_v_main_topics_0 ){
echo $v_v_main_topics_0['TopicName']. '<br/>';
}//foreach( $v_main_topics[0] as $k_v_main_topics_0 => $v_v_main_topics_0 )

}//else{

}//foreach( $main_topics as $k_main_topics => $v_main_topics )

但是得到这个

Products
Home
Computers
Laptops
Desktops
Dell
Acer

有些不对劲,但看不懂是什么。请告知代码中需要更正/更改的内容

尝试另一种方式

初始数组是一维数组。试图从一维获取 ul li 导航。

这是我所做的http://codepad.org/OLtxyL4X

【问题讨论】:

  • 这些数字真的意味着什么吗?换句话说,它们是否反映了数据库 ID 等?...此外,你为什么要嵌套一个额外的级别 [17] =&gt; Array ( [0] =&gt; Array ([18] =&gt; Array ( [0] =&gt; Array (..... 你真的需要这个吗?
  • 是的,数字是主键 - 数据库 ID。额外的水平,因为遵循这个答案stackoverflow.com/questions/7673044/…。现在出现了,不需要额外的等级。

标签: php arrays


【解决方案1】:

以下是它的功能摘要:

  • 递归地展平数组
  • 构建多维关系图
  • 创建将 UpperLevelNumberRenamed 链接到 NumberRenamed 的一维关系
  • 将多维打印为 ul-li 列表。

这里是:

$flat = array();
foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($main_topics)) as $i)
  $flat[] = $i;
$final = array();
$defs = array();
for ($i = 0; $i < count($flat); $i += 3)
    if ($flat[$i + 2] == 0) {
        $final[$flat[$i + 1]] = array();
        $defs[$flat[$i]] = &$final[$flat[$i + 1]];
    } else {
        $defs[$flat[$i + 2]][$flat[$i + 1]] = array();
        $defs[$flat[$i]] = &$defs[$flat[$i + 2]][$flat[$i + 1]];
    }

function array2ul($array) {
    $out = "<ul>";
    foreach($array as $key => $elem)
        $out = is_array($elem) ?
        $out . "<li><span>$key</span>" . array2ul($elem) . "</li>" : 
        $out = $out."<li><span>$key:[$elem]</span></li>";
    $out = $out . "</ul>";
    return $out; 
}

echo array2ul($final);

Output:

&lt;ul&gt;&lt;li&gt;&lt;span&gt;Products&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Computers&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Laptops&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Dell&lt;/span&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Acer&lt;/span&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Desktops&lt;/span&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Home&lt;/span&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;

【讨论】:

  • @user2118559 查看这个更新的答案,它现在是一个 ul-li 列表。看看这是否更好。
  • 是的,非常好的结果,谢谢(得到预期的结果)。我需要逐步理解代码。我现在的知识太贫乏了……
  • 正如$i += 3 中所理解的3 是每个子数组中的元素数。尝试修改并添加了另一个元素。这是结果eval.in/391531 似乎犯了一些错误
  • @user2118559 Try this。还要确保您使用的代码是上面的代码。我从 1 小时前开始编辑它。 HTML(呈现时)正确缩进。
  • @user2118559 你的逻辑是正确的,$i += 4 确实可以工作,只是它不适用于我之前编辑的旧代码。
【解决方案2】:

这应该是一个使用递归的工作示例,但未经测试:

定义数组

 $main_array = Array
    (
        '10' => Array
        (
            'name' => 'Products'
            'children' => Array
            (
                '12' => Array
                (
                    'name' => 'Laptop',
                    'children' => Array
                    (

                        '13' => Array
                        (
                            'name' => 'Dell',
                        ),
                        '14' => Array
                        (               
                            'name' => 'Acer',
                        )
                    )
                )
                '14' => Array
                (
                    'name' => 'Desktop',
                    'children' => Array
                    (

                        '15' => Array
                        (
                            'name' => 'Sony',
                        ),
                        '16' => Array
                        (               
                            'name' => 'Apple',
                        )
                    )
                ),
            ) 

        )
    )

创建并调用函数:

 function createList($main_topics)
        {
            if($main_topics == null || sizeof($main_topics) <= 0)
            {
                return '';
            }

            $list = '<ul>';
            foreach($main_topics as $k_main_topics => $v_main_topics )
            {

                $list .= '<li id="' . $k_main_topics'"> '. $v_main_topics['name'] . ' ' .  createList(isset($v_main_topics["children"]) ? $v_main_topics["children"] : null) . '</li>' ;

            }

            $list .= '</ul>';

            return $list;

        }

        echo createList($main_array);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-05
    • 2016-03-29
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    相关资源
    最近更新 更多