PHP foreach循环中访问int类型值的数组偏移量错误
问题根源:数据结构不匹配导致遍历异常
你遇到的核心问题是两个函数返回的数据结构不一致:
getAllPremises返回的是多行数据的数组(每个元素是一行的关联数组),比如:[ ['id' => 1, 'address_line2' => 'xxx', ...], ['id' => 2, 'address_line2' => 'yyy', ...] ]这种结构下,
foreach ($premises as $location)会把每个子数组赋值给$location,所以访问$location['address_line2']完全正常。而
getPremisesByCode返回的是单个关联数组(单行数据),比如:['id' => 1, 'address_line2' => 'xxx', ...]这时候
foreach会遍历这个数组的键值对,$location会被依次赋值为数组里的每个值(比如第一个值可能是数字1,然后是字符串xxx),你再尝试用$location['address_line2']时,就会触发“试图将非数组类型用作数组”的错误——因为此时$location是单个值,不是数组。
两种快速解决方法
方法1:修改getPremisesByCode函数,统一返回结构
让它返回和getAllPremises一致的“数组的数组”结构,即使只有一行数据也包装成数组返回:
function getPremisesByCode($connection, $premisesCode) { // 假设原来的查询逻辑如下(根据你的实际代码调整) $query = "SELECT * FROM premises WHERE code = ? LIMIT 1"; $stmt = $connection->prepare($query); $stmt->bind_param("s", $premisesCode); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { // 把单行数据包装成数组返回,和getAllPremises结构对齐 return [$result->fetch_assoc()]; } else { return NULL; } }
这样你的原有循环代码完全不用改,直接就能兼容两种函数的返回值。
方法2:在调用时包装单行数据(不修改函数)
如果不想改动函数,就在调用后判断数据结构,把单行数据手动包装成数组:
$premises = getPremisesByCode($connection, $premisesCode); //$premises = getAllPremises($connection); // 检查是否是单行关联数组,是的话包装成数组 if ($premises !== NULL && is_array($premises) && !isset($premises[0])) { $premises = [$premises]; } if($premises != NULL){ foreach ($premises as $location) { // 你的原有循环代码保持不变... } }
验证小技巧
可以用var_dump($premises)替代print_r,它会更清晰地显示数据的类型和结构,帮你快速确认函数返回的是单个数组还是数组的数组。
内容的提问来源于stack exchange,提问作者TiernO
相关产品推荐
相关产品推荐

