如何在PHP中按值搜索多维JSON数组并获取对应用户ID
解决方案
核心思路
你的PHP数组结构里,外层数组包含links和data两个键,其中data是存储所有用户记录的索引数组。每条用户记录里:
id是直接的顶级字段attributes是子数组,存储着包含email的用户属性
只需要遍历data数组,逐一检查每条记录的attributes['email']是否匹配目标值,找到后返回对应的id即可(因为email唯一,找到后可直接终止遍历节省资源)。
基础遍历实现(易理解,适合调试)
这种写法逻辑直白,新手也能快速上手:
// 假设$jsonString是原始JSON字符串,转成关联数组(第二个参数传true) $userData = json_decode($jsonString, true); $targetEmail = 'x3@gmail.com'; $matchedId = null; // 遍历所有用户记录 foreach ($userData['data'] as $userRecord) { // 访问嵌套的email字段做匹配校验 if ($userRecord['attributes']['email'] === $targetEmail) { $matchedId = $userRecord['id']; // 唯一email,找到就跳出循环 break; } } // 输出结果 if ($matchedId) { echo "匹配的用户ID:{$matchedId}"; } else { echo "未找到对应邮箱的用户"; }
简洁函数式实现
如果习惯用PHP数组函数,可以用array_filter快速过滤:
$userData = json_decode($jsonString, true); $targetEmail = 'x3@gmail.com'; // 过滤出匹配邮箱的用户记录 $filteredRecords = array_filter($userData['data'], function($record) use ($targetEmail) { return $record['attributes']['email'] === $targetEmail; }); // 取第一条匹配记录的id(email唯一,最多一条结果) $matchedId = !empty($filteredRecords) ? reset($filteredRecords)['id'] : null; var_dump($matchedId);
嵌套层级说明
你需要明确的数组层级路径:
- 外层数组:
$userData(包含links、data键) - 用户记录集合:
$userData['data'](索引数组,每个元素是单条用户数据) - 单条用户数据:
$userRecord(包含id、attributes等键) - 用户属性子数组:
$userRecord['attributes'](包含email字段)
所以访问邮箱的路径是$userRecord['attributes']['email'],访问ID的路径是$userRecord['id']
内容的提问来源于stack exchange,提问作者SteveG
相关产品推荐
相关产品推荐

