如何在含子数组的关联数组中获取多值?以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
相关产品推荐
相关产品推荐

