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

PHP解析嵌套JSON并筛选访问子节点数据求助

问题分析与解决建议

原代码的核心问题

  • 节点访问路径错误:$item['uuid']['dns_records']['name']逻辑完全错误——dns_records是$item的直接属性,并非$item['uuid']的子节点,且$item['uuid']是字符串,无法通过数组方式访问。
  • 未处理数组结构:dns_records是包含多个对象的数组,不能直接提取name值,需遍历或批量处理。
  • 循环逻辑缺陷:找到匹配的uuid后,后续循环会将dns_entries覆盖为空值,且未终止循环造成冗余遍历。

修正后的代码示例

方案1:提取所有匹配的name到数组

$data = json_decode($resp, true);
$dns_entries = [];

if (!empty($data) && isset($data['_embedded']['items'])) {
    foreach ($data['_embedded']['items'] as $item) {
        if ($item['uuid'] === $domain_id) {
            // 检查dns_records是否存在且为数组
            if (isset($item['dns_records']) && is_array($item['dns_records'])) {
                // 批量提取所有name值
                $dns_entries = array_column($item['dns_records'], 'name');
            }
            // 找到匹配项后终止循环,提升效率
            break;
        }
    }
}

// 输出结果(示例:换行展示每个name)
foreach ($dns_entries as $name) {
    echo $name . PHP_EOL;
}

方案2:拼接成字符串输出

如果需要直接输出所有匹配的name(用自定义分隔符连接):

$data = json_decode($resp, true);
$dns_entries = '';

if (!empty($data) && isset($data['_embedded']['items'])) {
    foreach ($data['_embedded']['items'] as $item) {
        if ($item['uuid'] === $domain_id) {
            if (isset($item['dns_records']) && is_array($item['dns_records'])) {
                // 用逗号分隔所有name,可替换为其他分隔符
                $dns_entries = implode(', ', array_column($item['dns_records'], 'name'));
            }
            break;
        }
    }
}

echo $dns_entries;

关键优化点

  • 用isset()检查数组节点,避免Undefined array key报错。
  • 匹配成功后立即break循环,减少不必要的遍历。
  • 利用array_column()快速提取数组指定键的值,简化代码。
  • 使用严格比较符===替代==,避免类型转换导致的错误匹配。

内容的提问来源于stack exchange,提问作者user2965052

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:36:29