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

如何用PHP正确提取Arweave交易数据的ID与标签名值及报错解决

解决PHP获取Arweave Transaction对象属性的错误问题

嘿,我来帮你搞定这个问题!首先得理清你代码里的核心错误:你实际拿到的是**Arweave\SDK\Support\Transaction类的PHP对象**,但你的代码却把它当成了JSON文件来处理,这就是为什么会出现json_decode() expects parameter 1 to be string和Invalid argument supplied for foreach()这两个错误的原因。

错误根源拆解

  1. 你用file_get_contents('product.json')试图读取JSON文件,但实际数据是已经实例化的Transaction对象,这一步完全是多余且错误的。
  2. 就算你真的要处理JSON,原来的foreach遍历逻辑也不对——你遍历的是整个JSON数组,而不是里面的tags子数组,导致根本取不到正确的标签数据。

正确的解决方案

因为Transaction对象的attributes是受保护属性,不能直接通过$transaction->attributes访问,我们分两种情况处理:

情况1:优先使用SDK提供的公共方法(推荐)

大部分SDK都会给核心对象封装公共方法来读取属性,比如Transaction类可能会有getId()、getTags()这类方法。如果是这样,代码会非常简洁:

// 假设$transaction是你已经获取到的Arweave Transaction实例
// 获取ID
$id = $transaction->getId();
echo "Transaction ID: " . $id . PHP_EOL;

// 获取并遍历标签
$tags = $transaction->getTags();
foreach ($tags as $tag) {
    $tagName = $tag['name'];
    $tagValue = $tag['value'];
    echo "标签名称: {$tagName}, 对应值: {$tagValue}" . PHP_EOL;
}

情况2:SDK没有提供公共方法,用反射读取受保护属性

如果SDK没有封装对应的方法,我们可以用PHP的反射机制来访问受保护的attributes属性:

// 假设$transaction是你的Transaction对象实例
$reflection = new ReflectionClass($transaction);
// 获取受保护的attributes属性
$attributesProp = $reflection->getProperty('attributes');
// 允许访问该属性
$attributesProp->setAccessible(true);
// 获取属性值
$attributes = $attributesProp->getValue($transaction);

// 获取ID
$id = $attributes['id'];
echo "Transaction ID: " . $id . PHP_EOL;

// 遍历标签数组
foreach ($attributes['tags'] as $tag) {
    $tagName = $tag['name'];
    $tagValue = $tag['value'];
    echo "标签名称: {$tagName}, 对应值: {$tagValue}" . PHP_EOL;
}

补充:如果你的数据确实是JSON文件(备用)

如果后续你真的需要从JSON文件读取数据,修正后的代码应该是这样(但根据你的描述,这个场景不适用当前问题):

$file = 'product.json';
// 先判断文件是否存在
if (!file_exists($file)) {
    die("文件不存在");
}
$data = file_get_contents($file);
$json = json_decode($data, true);

// 检查JSON解析是否成功
if (json_last_error() !== JSON_ERROR_NONE) {
    die("JSON解析失败: " . json_last_error_msg());
}

// 获取ID
$id = $json['id'] ?? '无ID';
echo "Transaction ID: " . $id . PHP_EOL;

// 遍历标签(注意是遍历$json['tags'],不是整个$json)
if (!empty($json['tags']) && is_array($json['tags'])) {
    foreach ($json['tags'] as $tag) {
        $tagName = $tag['name'] ?? '无名称';
        $tagValue = $tag['value'] ?? '无值';
        echo "标签名称: {$tagName}, 对应值: {$tagValue}" . PHP_EOL;
    }
} else {
    echo "无标签数据";
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:35:31