Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用php函数循环数组值_Php_Mysql_Arrays_Multidimensional Array_Twig - Fatal编程技术网

使用php函数循环数组值

使用php函数循环数组值,php,mysql,arrays,multidimensional-array,twig,Php,Mysql,Arrays,Multidimensional Array,Twig,我正试图用mysql作为存储数据创建多级下拉菜单,我使用twig作为主题引擎,我知道外面有很多代码,但是,所有的代码都是HTML作为输出,因为我使用twig,所以我需要数组作为输出,让twig渲染它(或者可能还有其他选项,如果有的话请告诉我)。 如果我使用html作为输出,这段代码就可以工作。但如果我改为数组作为输出,问题是第二级菜单仅显示1个数组或第一个数组,它不会循环。 这是我从mysql查询中得到的数组输出 Array ( [0] => Array (

我正试图用mysql作为存储数据创建多级下拉菜单,我使用twig作为主题引擎,我知道外面有很多代码,但是,所有的代码都是HTML作为输出,因为我使用twig,所以我需要数组作为输出,让twig渲染它(或者可能还有其他选项,如果有的话请告诉我)。
如果我使用html作为输出,这段代码就可以工作。但如果我改为数组作为输出,问题是第二级菜单仅显示1个数组或第一个数组,它不会循环。
这是我从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)

这是上面代码的输出

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()
的每次调用,孔菜单数组都是迭代的。这在下一个版本中仍然可以改进

结果如下:

数组
(
[0]=>阵列
(
[链接]=>1.html
[标题]=>仪表板
[sub]=>阵列
(
)
)
[1] =>阵列
(
[链接]=>2.html
[标题]=>主数据
[sub]=>阵列
(
[0]=>阵列
(
[链接]=>11.html
[标题]=>submaster
[sub]=>阵列
(
)
)
[1] =>阵列
(
[链接]=>12.html
[标题]=>submaster
[sub]=>阵列
(
)
)
)
)
)
此外,还有一些进一步的改进:为了删除空的子菜单数组,我添加了一个测试。参数的默认值设置为
$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级深度数组转换为多级深度数组的另一个示例,请参见。

好的,我对代码做了一些修改

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

        }
    }
    return $subarray;
}
就像$utama中的数组一样,如果有一个子元素来编写它,并且代码中有输入错误,
“sub”=>sub($allmenu,$id)
,它应该是
“sub”=>sub($items,$item['id'),
顺便说一句,非常感谢,你救了我的命,用这个我可以创建很多嵌套菜单。

希望这能奏效

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

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

是的,你是对的。我在
sub()
中监督了
$allmenu
的滥用。我在回答中编辑了这一点。在
sub()
中测试空子菜单也是一个好主意。OP的函数
sub()
在找到第一个子元素后由于返回而中断迭代。这是同样的问题。
function sub($items, $id){
        foreach($items as $item){
            if($item['parent_id'] == $id){
                $sub = sub($items, $item['id']);
                if(!empty($sub))
                    return array("link" =>$item['link'],"title"=>$item['title'],"sub"=>$sub);
                return array("link" =>$item['link'],"title"=>$item['title']);
            }
        }
    }

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