遍历PHP多维数组时foreach循环返回错误结果,求排查
问题分析与解决
错误原因
你的foreach循环逻辑存在问题,从var_dump的输出可以看到,$salesdetailsArray[74408]是一个一维关联数组,结构如下:
array(3) { ["category"]=> int(1) ["productid"]=> int(291) ["quantity"]=> string(4) "5.00" }
当你执行foreach ($salesdetailsArray[74408] as $onesale)时,$onesale会依次取到1、291、"5.00"这些单个值,而非数组。此时尝试访问$onesale['category']这类键值,会因为非数组类型返回空值;最后一次循环中$onesale是字符串"5.00",访问不存在的键会被解析为取字符串的第0位字符(即"5"),所以会重复输出三次5.,最终出现不符合预期的结果。
解决方法
方法1:直接访问数组键(适配单条数据场景)
如果仅处理单条销售详情,无需使用foreach,直接读取数组对应键即可:
$saleInfo = $salesdetailsArray[74408]; echo $saleInfo['category'] . ".<br />"; echo $saleInfo['productid'] . ".<br />"; // 可选:将"5.00"格式化为整数5 echo number_format((float)$saleInfo['quantity'], 0) . ".<br />";
方法2:调整数组结构+正确遍历(支持多条数据场景)
如果后续需要兼容一个saleid对应多条销售详情的情况,先修改数组存储逻辑,把每条详情作为子数组存入:
// 修改while循环内的数组赋值 while ($row = $results2->fetch()) { $saleid = $row['saleid']; // 将当前行数据追加到对应saleid的数组中 $salesdetailsArray[$saleid][] = [ 'category' => $row['category'], 'productid' => $row['productid'], 'quantity' => $row['quantity'] ]; } // 此时$salesdetailsArray[74408]是二维数组,可正常遍历每条详情 foreach ($salesdetailsArray[74408] as $onesale) { echo $onesale['category'] . ".<br />"; echo $onesale['productid'] . ".<br />"; echo number_format((float)$onesale['quantity'], 0) . ".<br /><br />"; }
这样无论单条还是多条销售数据,都能输出符合预期的结果。
内容的提问来源于stack exchange,提问作者Andreas BB
相关产品推荐
相关产品推荐

