
本文详解如何使用 PHP 正确解析包含多层结构的 JSON 响应,特别是当目标数据位于 data 数组内时,避免因误判顶层结构类型而导致 foreach 失败的问题。
本文详解如何使用 php 正确解析包含多层结构的 json 响应,特别是当目标数据位于 `data` 数组内时,避免因误判顶层结构类型而导致 foreach 失败的问题。
在处理来自 TronGrid 等区块链 API 的 JSON 响应时,一个常见误区是将整个响应体直接当作数组遍历。实际上,您提供的 JSON 是一个标准的 JSON 对象(associative array),其顶层结构包含 data、success 和 meta 三个键,而真正需要循环的交易数据全部嵌套在 $array['data'] 这个索引下。
原始代码的问题在于:
foreach ($array as $value) {
echo $value['txID']; // ❌ 错误:$array 是关联数组,键为 'data'/'success'/'meta',不是交易项
}此时 $value 依次是 ['data' => [...], ...]、true、['at' => ..., ...] —— 显然其中没有 'txID',因此输出为空。
✅ 正确做法是先定位到 data 子数组,再对其执行 foreach:
立即学习“PHP免费学习笔记(深入)”;
$url = 'https://api.trongrid.io/v1/accounts/TQ82FS4og14am8BXqndHX8HrYYARrhmjBk/transactions?only_confirmed=true&only_to=true&limit=3';
$content = file_get_contents($url);
// 解码为关联数组(第二个参数 true 至关重要)
$obj = json_decode($content, true);
// 检查解码是否成功及 data 是否存在且为数组
if (json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException('Invalid JSON response: ' . json_last_error_msg());
}
if (!isset($obj['data']) || !is_array($obj['data'])) {
echo "No transaction data found.\n";
} else {
// ✅ 正确遍历 data 数组中的每一笔交易
foreach ($obj['data'] as $tx) {
if (isset($tx['txID'])) {
echo "Transaction ID: " . $tx['txID'] . "\n";
}
}
}? 关键注意事项:
-
json_decode($json, true)必须传入true,否则返回的是stdClass对象,需用->txID访问(非数组语法); - 永远不要跳过错误检查:使用
json_last_error()验证解码可靠性; - 使用
isset()和is_array()防御性判断,避免因 API 返回异常结构(如空 data 或 error 字段)导致 Notice 或 Warning; - 若需进一步处理每笔交易的子字段(如
raw_data.contract[0].parameter.value.amount),可逐层安全访问:$amount = $tx['raw_data']['contract'][0]['parameter']['value']['amount'] ?? 0;
通过明确区分 JSON 的对象外层与数组内层,即可稳定、高效地批量提取 txID 及其他任意嵌套字段。



















