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

如何在含子数组的关联数组中获取多值?以Contacts数组为例

正确实现contacts数组的方案

嘿,你的代码里有两个关键问题需要修正,才能正确把contacts整理成数组,还能避免重复数据的问题:

问题1:PHP数组语法错误

你在数组赋值的时候用了=,但PHP里关联数组的键值对应该用=>,这个语法错误会直接导致代码运行失败。

问题2:LEFT JOIN导致的重复客户条目

因为用了LEFT JOIN,同一个客户如果有多个联系方式,查询结果会返回多条记录。如果直接循环添加到$data里,会生成多个相同客户的条目,而不是把多个contacts合并到同一个客户下。


正确的实现代码

$query = "SELECT cl.id, cl.name, ct.phone, ct.address FROM clients cl LEFT JOIN contacts ct ON cl.id = ct.client_id"; 
// 注:这里把JOIN条件改成了ct.client_id(通常contacts表的外键是关联客户ID,而非自身主键),如果你的表结构确实是ct.id=cl.id,可改回原条件
$statement = $conexion->query($query); 

// 用客户ID作为键,避免重复创建客户条目
$clients = [];

while($row = $statement->fetch_assoc()) {
    $clientId = $row['id'];
    // 客户未存在时,初始化基础条目
    if (!isset($clients[$clientId])) {
        $clients[$clientId] = [
            'id' => $clientId,
            'name' => $row['name'],
            'contacts' => [] // 初始化空的contacts数组
        ];
    }
    // 仅当联系方式存在时,添加到contacts数组(避免LEFT JOIN返回的空数据)
    if (!is_null($row['phone']) || !is_null($row['address'])) {
        $clients[$clientId]['contacts'][] = [
            'phone' => $row['phone'],
            'address' => $row['address']
        ];
    }
}

// 转换为索引数组,和你原需求的输出结构一致
$data = array_values($clients);

echo json_encode($data);

代码说明

  • 用客户ID作为数组键,确保同一个客户只会被创建一次,彻底避免重复条目。
  • 增加了空值判断,防止把LEFT JOIN返回的空联系方式添加到数组里。
  • 最后用array_values()把关联数组转成索引数组,和你最初想要的输出结构匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:16:49