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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:32:32