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

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); // 此语句打印数组的正确部分               
    }
});
问题分析与解决方案

你的代码问题和时序无关,主要是以下几个错误:

  1. array_find遍历对象错误
    你传入的是整个$data数组,但实际需要遍历的是$data['conf']子数组,所有配置项都在这个键下面。

  2. 闭包变量作用域问题
    闭包内给$userConf赋值时,没有通过引用传递,导致外部的$userConf不会被修改。另外,array_find需要返回true来终止遍历,找到目标项后必须返回true,否则会继续遍历无效元素。

  3. 数组索引错误
    遍历$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 23:27:26