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_
相关产品推荐
相关产品推荐

