【问题标题】:looping array value with function php使用函数php循环数组值
【发布时间】:2015-06-14 02:47:41
【问题描述】:

我正在尝试使用 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)

$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。
如果我的代码有错误,请告诉我,如果有链接可以完成这项工作,请告诉我。谢谢

【问题讨论】:

    标签: php mysql arrays multidimensional-array twig


    【解决方案1】:

    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 中找到。

    【讨论】:

      【解决方案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'), 顺便说一句,非常感谢,你救了我的命,有了这个我可以创造很多嵌套菜单。

      【讨论】:

      • 是的,你是对的。我监督了$allmenusub() 中的滥用。我在我的答案中编辑了这个。将空子菜单的测试放在sub() 中也是一个好主意。
      【解决方案3】:

      希望这项工作

      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));
              }
          }
      

      【讨论】:

      • OP 的函数sub() 在找到第一个子元素后因返回而中断迭代。这是同样的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      相关资源
      最近更新 更多