OpenCart:如何遍历三维数组中子数组,实现分类与子分类展示
解决OpenCart MVC中分类与子分类的数组构建及前端渲染问题
我看你在给分类数组添加子分类并渲染的时候踩了两个典型的坑:后端数组赋值的引用问题和前端数组访问的语法错误,我来一步步帮你修正:
一、后端Controller代码修正
你的第二个循环里,直接对$category赋值不会修改原$data['categories']数组(PHP默认是值传递,$category只是原数组元素的副本),而且每次循环会覆盖subcategories,导致最后只保留最后一个子分类。另外,初始化subcategories的时候应该设为空数组,而不是单个元素。
修正后的代码:
$data['categories'] = array(); $results = $this->model_catalog_category->getCategories($category_id); foreach ($results as $result) { $filter_data = array( 'filter_category_id' => $result['category_id'], 'filter_sub_category' => true ); // 初始化子分类为空数组,后续直接追加 $category_item = array( 'root_categories' => array( 'category_id' => $result['category_id'], 'name' => $result['name'], 'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '_' . $result['category_id'] . $url), ), 'subcategories' => array() ); // 直接获取当前分类的子分类并填充到数组中 $sub_results = $this->model_catalog_category->getCategories($result['category_id']); foreach ($sub_results as $sub_result) { $category_item['subcategories'][] = array( 'sub_name' => $sub_result['name'], 'sub_href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '_' . $sub_result['category_id'] . $url), ); } $data['categories'][] = $category_item; }
把获取子分类的逻辑合并到第一个循环里,直接操作待插入的数组项,既避免了值传递的问题,也保证每个分类的子分类都能被正确追加。
二、前端View代码修正
你的前端代码有两个明显错误:
- 访问子分类属性时用了
$category[$sub_category]['sub_name'],这是错误的语法,$sub_category本身就是子分类数组,直接访问键名即可; - 判断子分类是否存在时,应该检查数组是否不为空,避免空数组导致的无效遍历。
修正后的前端代码:
<div class="row"> <?php if ($categories) { ?> <div class="row" style='margin-top: 13px; '> <div class="col-sm-3"> <ul> <?php foreach ($categories as $category) { ?> <div class='tests'> <li class='sidebar_form_item click_here_for_demo' style='padding: 5px; margin-bottom: 0px;'> <i class="fa fa-chevron-right" style='font-size: 12px; margin: 6px 7px 0px 7px; color: #696969; float: left;'></i> <div style='width: 250px; float: left;'> <a href="<?php echo $category['root_categories']['href']; ?>" style='color: #696969; font-size: 12px;'> <?php echo $category['root_categories']['name']; ?> </a> </div> <div class='clearfix'></div> </li> <?php if (!empty($category['subcategories'])) { ?> <?php foreach ($category['subcategories'] as $sub_category) { ?> <li class='sidebar_form_item show_when_neded' style='display: none; padding: 5px 5px 5px 20px; margin-bottom: 0px;'> <i class="fa fa-chevron-right" style='font-size: 12px; margin: 6px 7px 0px 7px; color: #696969; float: left;'></i> <div style='width: 250px; float: left;'> <a href="<?php echo $sub_category['sub_href']; ?>" style='color: #696969; font-size: 12px;'> <?php echo $sub_category['sub_name']; ?> </a> </div> <div class='clearfix'></div> </li> <?php } ?> <?php } ?> </div> <?php } ?> </ul> </div> </div> <?php }?> </div>
关键问题解释
- 后端值传递问题:PHP的
foreach默认是值传递,修改循环变量不会影响原数组元素,合并逻辑后直接操作待插入的数组项就解决了这个问题; - 前端属性访问错误:
$sub_category是子分类数组本身,直接用$sub_category['sub_name']就能拿到对应值,不需要绕弯子; - 空数组判断:用
!empty()可以同时检查数组是否存在且不为空,避免遍历空数组导致的无效渲染。
内容的提问来源于stack exchange,提问作者Heiwan
相关产品推荐
相关产品推荐

