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

PHP中如何判断JSON解析后的Activity是对象还是数组?

问题分析与解决方案

你遇到的核心问题是:用json_decode($json, true)将JSON转为关联数组时,单个Activity对象会被解析成一维关联数组,而多个Activity会被解析成二维数组。这时候is_array()对两种情况都会返回true,count()统计的是关联数组的属性数量(也就是单个对象的字段数,比如你得到的4),而非对象个数。

下面提供两种可靠的判断方式:

方式1:保留JSON对象类型(不转关联数组)

直接使用json_decode的默认行为(第二个参数不传true),此时单个Activity是stdClass对象,多个Activity是包含stdClass的数组,用is_array()可以准确区分:

// 解析JSON,保留对象类型
$response = json_decode($json_data);
$activity = $response->TrackResponse->Activity;

if (is_array($activity)) {
    // 处理对象数组,count结果为对象个数
    $total = count($activity);
    echo "Activity是数组,共{$total}个对象";
} else {
    // 处理单个对象,可转为数组统一后续逻辑
    $activity = [$activity];
    echo "Activity是单个对象,已转为数组处理";
}

方式2:转为关联数组后判断索引类型

如果必须使用关联数组,可通过判断数组的键是否为数字索引来区分:
单个对象转成的关联数组,键是字符串(比如EventTime、Description);而对象数组的键是0、1、2这类数字索引。

// 解析为关联数组
$response = json_decode($json_data, true);
$activity = $response['TrackResponse']['Activity'];

// 检查是否为数字索引数组(即多个对象)
if (is_array($activity) && is_int(key($activity))) {
    $total = count($activity);
    echo "Activity是数组,共{$total}个对象";
} else {
    // 单个对象转为数组
    $activity = [$activity];
    echo "Activity是单个对象,已转为数组处理";
}

补充说明

之前count($activity)得到4,是因为单个JSON对象被转成关联数组后,统计的是该数组的键值对数量(也就是对象的4个字段),而非你期望的对象个数。通过上面两种方式,就能准确区分并统一后续的处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:42:09