
本文详解如何使用 json_decode() 和 array_column() 高效提取嵌套 JSON 数组中所有指定键(如 id)的值,避免手动遍历,兼顾简洁性与可扩展性。
本文详解如何使用 `json_decode()` 和 `array_column()` 高效提取嵌套 json 数组中所有指定键(如 `id`)的值,避免手动遍历,兼顾简洁性与可扩展性。
在 PHP 开发中,经常需要从 JSON 格式的 API 响应中批量提取某一层级下所有同名字段(例如每个商品对象中的 "id")。若仅用 $data->response[0]->id 这类硬编码索引访问,不仅无法覆盖全部数据,还极易因结构变动引发错误。
正确做法是:先将 JSON 字符串安全解析为 PHP 对象(或数组),再利用内置函数批量提取目标键值。推荐组合方案如下:
✅ 核心步骤(两行解决)
$json = '{"response":[
{"id": 37, "slug": "red", "stock": true, "name": "Red", "default": 0, "sizes": "38"},
{"id": 38, "slug": "red", "stock": true, "name": "Red", "default": 0, "sizes": "40"}
]}';
$data = json_decode($json); // 解析为 stdClass 对象
$ids = array_column($data->response, 'id'); // 批量提取所有 id
print_r($ids);
// 输出:
// Array
// (
// [0] => 37
// [1] => 38
// )? 关键说明
- json_decode($json) 默认返回 stdClass 对象;若需关联数组,传入第二个参数 true:json_decode($json, true),此时 array_column() 同样适用。
- array_column() 是 PHP 5.5+ 原生函数,专为“从多维数组/对象数组中提取单列值”设计,性能优于 foreach 循环,且自动跳过缺失键(无 Notice 警告)。
- 若目标键位于更深嵌套层级(如 response[i].product.id),array_column() 不直接支持,此时需配合 array_map() 或递归函数处理。
⚠️ 注意事项
-
务必检查解析结果:json_decode() 失败时返回 null,建议添加错误检测:
if (json_last_error() !== JSON_ERROR_NONE) { throw new InvalidArgumentException('Invalid JSON: ' . json_last_error_msg()); } - 键名大小写敏感:'id' 与 'ID' 视为不同键,确保名称完全匹配。
- 空数组保护:当 response 为空或不存在时,array_column() 返回空数组,安全但需业务层判断是否预期。
? 扩展用法(获取键值对映射)
若需 id => name 的映射关系,可结合第三个参数:
$idToName = array_column($data->response, 'name', 'id'); // 结果:[37 => 'Red', 38 => 'Red']
综上,json_decode() + array_column() 是提取 JSON 中同名键值的标准、高效、健壮方案,适用于绝大多数 RESTful API 数据处理场景。
立即学习“PHP免费学习笔记(深入)”;











