PHP:如何从API返回的多维数组获取匹配ID的settings数据
问题描述
我正在编写一个函数,从API调用中获取配置信息。特定配置的ID来自名为id的查询字符串,用户可拥有多个配置,因此通过该ID获取对应配置。API调用的token存储在名为token的cookie中。
API调用本身一切正常,但我难以得到期望的输出。我使用array_find根据id查找正确的配置,仅需要与指定id关联的数组中的settings部分。我不确定为何返回无数据,怀疑可能与API调用的时序问题有关。
API返回的数组结构如下:
Array ( [conf] => Array ( [0] => Array ( [id] => 123 [configuration] => Array ( [title] => Settings 1 [settings] => Array ( [color] => blue [size] => 800 ) ) ) )
我的PHP代码如下:
$id = sanitize_text_field($_REQUEST['id']); $data = json_decode($response, true); print_r($data); // 此语句打印完整数组 $userConf = []; array_find($data, function($conf) use ($id) { if ($conf[0]['id'] === $id) { $userConf = $conf[0]['configuration']['settings']; $config = array( 'color' => sanitize_text_field($userConf['color'] ?? ''), 'size' => sanitize_text_field($userConf['size'] ?? '') ); print_r($config); // 此语句打印数组的正确部分 } });
问题分析与解决方案
你的代码问题和时序无关,主要是以下几个错误:
array_find遍历对象错误
你传入的是整个$data数组,但实际需要遍历的是$data['conf']子数组,所有配置项都在这个键下面。闭包变量作用域问题
闭包内给$userConf赋值时,没有通过引用传递,导致外部的$userConf不会被修改。另外,array_find需要返回true来终止遍历,找到目标项后必须返回true,否则会继续遍历无效元素。数组索引错误
遍历$data['conf']时,每个$conf就是单个配置项(比如Array([id]=>123, ...)),不需要再取$conf[0]。
修正后的代码:
$id = sanitize_text_field($_REQUEST['id']); $data = json_decode($response, true); $userConf = []; // 遍历conf子数组而非整个$data array_find($data['conf'], function($conf) use ($id, &$userConf) { // 直接比较当前配置项的id,转字符串避免类型不匹配 if ((string)$conf['id'] === $id) { $userConf = $conf['configuration']['settings']; $config = array( 'color' => sanitize_text_field($userConf['color'] ?? ''), 'size' => sanitize_text_field($userConf['size'] ?? '') ); print_r($config); // 返回true终止遍历 return true; } return false; }); // 此时外部的$userConf已被赋值为目标settings数组 print_r($userConf);
额外说明:
- 用
&$userConf将变量以引用方式传入闭包,确保内部修改能同步到外部。 - 把
$conf['id']转为字符串,避免API返回的数字ID和查询字符串的字符串ID类型不匹配导致判断失败。 - 找到匹配项后返回
true,提前终止遍历提升效率。
内容的提问来源于stack exchange,提问作者janlindso
相关产品推荐
相关产品推荐

