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

PHP开发求助:foreach循环报Invalid argument supplied for foreach()错误

问题排查与修复方案

核心问题分析

1. Foreach警告错误

Invalid argument supplied for foreach() 错误出现在 foreach ($data as $row) 行,原因是$data不是可遍历的数组/对象——可能是未定义、值为null,或是单个非遍历类型(比如字符串、数字)。

2. 表格仅显示一行

你的<tr>标签完全在foreach循环外部,循环仅空执行,没有生成多行;第一个foreach仅做数据累加,未输出表格行,最终只渲染了一行静态内容。


修复代码与步骤

第一步:解决Foreach警告

在遍历前先校验$data的合法性,确保它可遍历:

// 替换原空foreach逻辑
<?php if(is_iterable($data)): ?>
    <?php foreach ($data as $row) :  ?>
        <!-- 表格行代码放在循环内部 -->
    <?php endforeach;?>
<?php else: ?>
    <!-- 无数据时的提示行 -->
    <tr>
        <td colspan="8" class="text-center">暂无数据</td>
    </tr>
<?php endif; ?>

第二步:修复多行渲染问题

将<tr>整体移入foreach循环内,同时调整累加逻辑的变量命名避免冲突:

完整修复后的代码:

<tbody>
    <?php
        $no = 1;                                                
        $marketSize = 0;
        $pmarketShare = 0;
        $cmarketShare = 0;
        $rprevenue = 0;
        $prevenue = 0;
        $crevenue =0;
        
        // 先处理汇总数据累加(如果需要)
        if(isset($value['data']) && $value['data']->num_rows() > 0): 
            foreach ($value['data']->result() as $sumRow):
                $marketSize += $sumRow->total_size;
                $pmarketShare += $sumRow->avg_share;
                $cmarketShare += $sumRow->sum_share;
            endforeach; 
        endif;
    ?>

    <?php if(is_iterable($data)): ?>
        <?php foreach ($data as $row) :  ?>
            <tr>                               
                <td width="10px"><?= $no++ ?></td>
                <td>
                    <a data-market="<?= $row->kota; ?>" data-tahun="<?= $filter['yearstart']; ?>">
                        <?= $row->kota; ?>
                    </a>
                </td>
                <td class="text-right">
                    <a data-market="<?= $row->total_size; ?>" data-tahun="<?= $filter['yearstart']; ?>">
                        <?= number_format($row->total_size, 2, ',', '.') ?>
                    </a>
                </td>
                <td class="text-right">
                    <a data-market="<?= $row->avg_share; ?>" data-tahun="<?= $filter['yearstart']; ?>">
                        <?= number_format($row->avg_share, 2, ',', '.'). "%" ?>
                    </a>
                </td>
                <td class="text-right">
                    <a data-market="<?= $row->sum_share; ?>" data-tahun="<?= $filter['yearstart']; ?>">
                        <?= number_format($row->sum_share, 2, ',', '.') ?>
                    </a>
                </td>
                <td class="text-right">
                    <a data-market="0" data-tahun="<?= $filter['yearstart']; ?>">
                        <?= number_format($rprevenue, 2, ',', '.') ?>
                    </a>
                </td>
                <td class="text-right">
                    <a data-market="0" data-tahun="<?= $filter['yearstart']; ?>">
                        <?= number_format($prevenue, 2, ',', '.') ?>
                    </a>
                </td>
                <td class="text-right">
                    <a data-market="0" data-tahun="<?= $filter['yearstart']; ?>">
                        <?= number_format($crevenue, 2, ',', '.') ?>
                    </a>
                </td>
            </tr>
        <?php endforeach;?>
    <?php else: ?>
        <tr>
            <td colspan="8" class="text-center">暂无数据</td>
        </tr>
    <?php endif; ?>
</tbody>

额外注意事项

  • 确认$data已正确赋值为可遍历的查询结果(比如CodeIgniter的->result()/->result_array()返回值)
  • 若$value['data']与$data为同一数据源,可合并逻辑避免重复遍历
  • 检查$filter['yearstart']是否已定义,避免未定义变量警告

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:27:50