You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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代码修正

你的前端代码有两个明显错误:

  1. 访问子分类属性时用了$category[$sub_category]['sub_name'],这是错误的语法,$sub_category本身就是子分类数组,直接访问键名即可;
  2. 判断子分类是否存在时,应该检查数组是否不为空,避免空数组导致的无效遍历。

修正后的前端代码:

<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>

关键问题解释

  1. 后端值传递问题:PHP的foreach默认是值传递,修改循环变量不会影响原数组元素,合并逻辑后直接操作待插入的数组项就解决了这个问题;
  2. 前端属性访问错误:$sub_category是子分类数组本身,直接用$sub_category['sub_name']就能拿到对应值,不需要绕弯子;
  3. 空数组判断:用!empty()可以同时检查数组是否存在且不为空,避免遍历空数组导致的无效渲染。

内容的提问来源于stack exchange,提问作者Heiwan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:00:41