使用web3.php回调读取智能合约数组返回值的问题
解决web3.php中接收合约返回数组的问题
我之前也碰到过一模一样的情况,web3.php处理合约返回的数组类型时,返回的$result往往不是咱们预期的普通索引数组,直接用[index]访问自然会失效。下面是具体的解决思路和代码示例:
第一步:先搞清楚返回结果的真实结构
首先你得先确认$result到底是什么格式,在回调里加一行var_dump($result)打印出来,这是最快定位问题的方式:
$contract->at($contractAddress)->call($functionName, function ($err, $result) use ($contract) { if ($err !== null) { echo "error"; throw $err; } if ($result) { // 打印结果结构,这一步至关重要 var_dump($result); } });
运行后你大概率会看到两种常见格式:
- 字符串键的关联数组:比如
array('0' => 15, '1' => 30),这时候数字索引[0]会找不到值,因为键是字符串类型 Web3\Result封装对象:这时候需要调用对象的方法才能拿到底层的数组数据
第二步:根据结构针对性处理数组
处理关联数组的情况
如果是字符串键的关联数组,用array_values()把它转成普通索引数组就能正常访问了:
$contract->at($contractAddress)->call($functionName, function ($err, $result) use ($contract) { if ($err !== null) { echo "error"; throw $err; } if ($result) { // 转换为数字索引数组 $arrayResult = array_values($result); // 现在就能正常用索引访问元素了 echo "第一个数组元素:" . $arrayResult[0]; echo "第二个数组元素:" . $arrayResult[1]; } });
处理Result对象的情况
如果var_dump显示是Web3\Result对象,调用它的getValue()方法就能拿到咱们需要的数组:
$contract->at($contractAddress)->call($functionName, function ($err, $result) use ($contract) { if ($err !== null) { echo "error"; throw $err; } if ($result) { // 获取对象底层的数组数据 $arrayResult = $result->getValue(); // 正常访问数组元素 echo "第一个数组元素:" . $arrayResult[0]; } });
额外小提示
- uint8类型的返回值会被web3.php自动转换成PHP的整数类型,不需要额外做类型转换
-不同版本的web3.php返回格式可能略有差异,所以第一步的var_dump调试绝对不能省
内容的提问来源于stack exchange,提问作者HansPeterLoft
相关产品推荐
相关产品推荐

