如何用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()这两个错误的原因。
错误根源拆解
- 你用
file_get_contents('product.json')试图读取JSON文件,但实际数据是已经实例化的Transaction对象,这一步完全是多余且错误的。 - 就算你真的要处理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
相关产品推荐
相关产品推荐

