php - 使用函数 php 循环数组值

标签 php mysql arrays multidimensional-array twig

我正在尝试使用 mysql 作为存储数据创建多级下拉菜单,并且我使用 twig 作为主题引擎,我知道外面有大量代码但是,所有这些都是 HTML 作为输出,因为我使用 twig,所以我需要数组作为输出,然后让 twig 渲染它,(或者可能有其他选项,如果是的话请告诉我)。
如果我使用 html 作为输出,则此代码有效。但如果我更改为数组作为输出,问题是第二级菜单仅显示一个数组或第一个数组,它不会循环。
这是我从 mysql 查询中输出的数组,

Array
(
    [0] => Array
        (
            [id] => 1
            [title] => Dashboard
            [link] => 1.html
            [parent_id] => 0
        )

    [1] => Array
        (
            [id] => 2
            [title] => Master Data
            [link] => 2.html
            [parent_id] => 0
        )

    [2] => Array
        (
            [id] => 3
            [title] => submaster
            [link] => 11.html
            [parent_id] => 2
        )
    [3] => Array
        (
            [id] => 4
            [title] => submaster
            [link] => 12.html
            [parent_id] => 2
        )

这是我尝试转换的代码,我的意思是在它编码 html 作为输出之前 (ul>li>ul>li>/li>/ul>/li>/lu)

$id = '';
function sub($items, $id){
    foreach($items as $item){
        if($item['parent_id'] == $id){
            return array("link" =>$item['link'],"title"=>$item['title']);
            sub($items, $item['id']);
        }
    }
}
foreach($allmenu as $data){
    if($data['parent_id'] == 0){
        $id = $data['id'];
        $utama[]= array("link"=>$data['link'],"title"=>$data['title'],"sub"=>sub($allmenu, $id));
    }
}

这是上面代码的输出

Array
(
    [links] => Array
        (
            [0] => Array
                (
                    [link] => 1.html
                    [title] => Dashboard
                    [sub] => 
                )

            [1] => Array
                (
                    [link] => 2.html
                    [title] => Master Data
                    [sub] => Array
                        (
                            [link] => 11.html
                            [title] => Kampus
                        )

                )

        )

)

看..在第二个数组(主数据)中它应该是两个数组对吗?带有链接 11.html 和 12.html。
如果我的代码有错误,请告诉我,如果有链接可以完成这项工作,请告诉我。谢谢

最佳答案

OP 的函数 sub() 在找到第一个子元素后由于返回而中断迭代。最好用给定父 $id 的所有子元素构建一个数组,并在函数末尾返回此数组:

function sub($items, $id){
    $subarray = array();
    foreach($items as $item){
        if($item['parent_id'] == $id){
            $subarray[] = array(
                "link"  => $item['link'],
                "title" => $item['title'],
                "sub"   => sub($items, $item['id']),
            );
        }
    }
    return $subarray;
}

我还在子数组的构建中集成了 sub() 的调用。缺点是每次调用函数 sub() 时,都会迭代孔菜单数组。这在下一个版本中仍然可以改进。

结果如下:

Array
(
    [0] => Array
        (
            [link] => 1.html
            [title] => Dashboard
            [sub] => Array
                (
                )
        )

    [1] => Array
        (
            [link] => 2.html
            [title] => Master Data
            [sub] => Array
                (
                    [0] => Array
                        (
                            [link] => 11.html
                            [title] => submaster
                            [sub] => Array
                                (
                                )
                        )

                    [1] => Array
                        (
                            [link] => 12.html
                            [title] => submaster
                            [sub] => Array
                                (
                                )
                        )
                )
        )
)

此外还有一些进一步的改进:为了删除空的子菜单数组,我添加了一个测试。参数的默认值设置为 $id = 0。有了这个,就不需要为初始调用传递父 ID。现在主程序中不再需要 foreach 循环了。您可以直接调用 sub()。使用与 OP 相同的变量名称,程序如下所示:

function sub($items, $id = 0){
    $subarray = array();
    foreach($items as $item){
        if($item['parent_id'] == $id) {
            $submenu = array(
                "link"  => $item['link'],
                "title" => $item['title'],
            );
            $subsubmenu = sub($items, $item['id']);
            if (!empty($subsubmenu)) {
                $submenu['sub'] = $subsubmenu;
            }
            $subarray[] = $submenu;
        }
    }
    return $subarray;
}

$utama = sub($allmenu);

关于如何将 2 级深度数组转换为多级深度数组的另一个示例可以在 this answer 中找到。 .

关于php - 使用函数 php 循环数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30825529/

相关文章:

javascript - 循环遍历数组并将值分配给变量

c - 需要帮忙进行数组赋值

php - 显示真实内容,而不是 HTML 标签和内联 CSS 包裹的内容

php - 从表中找出相关数据

php - 如何在同一个文件中为多个版本的 PHP 编写代码而不出错?

python - 我正在为年度 session 事件制作一个由 SQL 支持的网站。我应该如何构建对象之间的边缘?

java - 将 java 属性传递给 javascript 函数数组参数

php - mysql 选择带有转义引号的记录

php - 如何验证用户是否从 mysql 数据库中删除记录

php - MYSQL IF(expr1,expr2,expr3) 但我不想要任何 expr3(如果 expr3 则不输出任何内容