如何在单个for循环中同时遍历两个数组?Solidity代码实现问询
问题原因与修复方案
你现有代码的核心问题如下:
- for循环语法错误:Solidity不支持你写的用&分隔两个独立循环变量的写法,你的业务场景是两个数组同下标对应同一个时间段的起止时间,直接用单个索引变量遍历同下标元素即可,前提是要先保证两个数组长度一致。
- 取值逻辑错误:你把循环的索引变量直接当成了时间值判断,实际上需要取对应索引下数组里存储的时间值
- assert使用错误:assert没有返回值,校验失败会直接触发交易回滚,你不该用它做逻辑判断,数组长度一致性校验应该放在循环执行前
- 基础语法错误:循环条件中的
etime = squareEndTimeArray.length是赋值操作,不是长度比较判断,另外函数声明了返回address类型但没有返回对应值 - 边界逻辑漏洞:如果两个数组长度不一致,会出现数组越界访问的异常,导致交易失败
修复后可运行代码
function setwinner() internal returns(address){ // 先校验两个时间段数组长度一致,保证每个开始时间都有对应的结束时间 require(squareStartTimeArray.length == squareEndTimeArray.length, "Time array length mismatch"); uint arrayLength = squareStartTimeArray.length; // 单个索引变量同时遍历两个数组的同下标元素 for (uint i = 0 ; i < arrayLength; i++) { uint startTime = squareStartTimeArray[i]; uint endTime = squareEndTimeArray[i]; if (winningTime >= startTime && winningTime <= endTime) { winningIndex = i; winningAddress = playerArray[i]; // 匹配到就可以直接跳出循环,不用继续遍历节省gas break; } } return winningAddress; }
额外注意点
- 代码中提前用
require校验两个数组长度一致,避免越界问题 - 匹配到符合条件的时间段后直接跳出循环,能有效节省链上gas消耗
- 记得给
winningAddress设置合理的默认值,避免没有匹配到时间段时返回零地址
内容的提问来源于stack exchange,提问作者Japarjam
相关产品推荐
相关产品推荐

