如需获取本内容的最新版本,请参见 Cyfrin.io 上的Array(代码示例)
数组可以具有编译时固定大小或动态大小。
solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
contract Array {
// 初始化数组的几种方法
uint256[] public arr;
uint256[] public arr2 = [1, 2, 3];
// 固定大小的数组,所有元素初始化为0
uint256[10] public myFixedSizeArr;
function get(uint256 i) public view returns (uint256) {
return arr[i];
}
// Solidity 可以返回整个数组。
// 但应避免将此函数用于长度可能无限增长的数组。
function getArr() public view returns (uint256[] memory) {
return arr;
}
function push(uint256 i) public {
// 追加到数组
// 这将使数组长度增加1。
arr.push(i);
}
function pop() public {
// 从数组中移除最后一个元素
// 这将使数组长度减少1
arr.pop();
}
function getLength() public view returns (uint256) {
return arr.length;
}
function remove(uint256 index) public {
// 删除操作不会改变数组的长度。
// 它会将索引处的值重置为其默认值,
// 在本例中为0
delete arr[index];
}
function examples() external pure {
// 在内存中创建数组,只能创建固定大小的数组
uint256[] memory a = new uint256[](5);
// 在内存中创建一个嵌套数组
// b = [[1, 2, 3], [4, 5, 6]]
uint256[][] memory b = new uint256[][](2);
for (uint256 i = 0; i < b.length; i++) {
b[i] = new uint256[](3);
}
b[0][0] = 1;
b[0][1] = 2;
b[0][2] = 3;
b[1][0] = 4;
b[1][1] = 5;
b[1][2] = 6;
}
}
Remix Lite 尝试一下

删除数组元素的示例
通过从右向左移动元素来移除数组元素
solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
contract ArrayRemoveByShifting {
// [1, 2, 3] -- remove(1) --> [1, 3, 3] --> [1, 3]
// [1, 2, 3, 4, 5, 6] -- remove(2) --> [1, 2, 4, 5, 6, 6] --> [1, 2, 4, 5, 6]
// [1, 2, 3, 4, 5, 6] -- remove(0) --> [2, 3, 4, 5, 6, 6] --> [2, 3, 4, 5, 6]
// [1] -- remove(0) --> [1] --> []
uint256[] public arr;
function remove(uint256 _index) public {
require(_index < arr.length, "索引越界");
for (uint256 i = _index; i < arr.length - 1; i++) {
arr[i] = arr[i + 1];
}
arr.pop();
}
function test() external {
arr = [1, 2, 3, 4, 5];
remove(2);
// [1, 2, 4, 5]
assert(arr[0] == 1);
assert(arr[1] == 2);
assert(arr[2] == 4);
assert(arr[3] == 5);
assert(arr.length == 4);
arr = [1];
remove(0);
// []
assert(arr.length == 0);
}
}
Remix Lite 尝试一下

通过将最后一个元素复制到要删除的位置来移除数组元素
solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
contract ArrayReplaceFromEnd {
uint256[] public arr;
// 删除一个元素会在数组中留下一个空隙。
// 保持数组紧凑的一个技巧是,将最后一个元素移动到要删除的位置。
function remove(uint256 index) public {
// 将最后一个元素移动到要删除的位置
arr[index] = arr[arr.length - 1];
// Remove the last element
arr.pop();
}
function test() public {
arr = [1, 2, 3, 4];
remove(1);
// [1, 4, 3]
assert(arr.length == 3);
assert(arr[0] == 1);
assert(arr[1] == 4);
assert(arr[2] == 3);
remove(2);
// [1, 4]
assert(arr.length == 2);
assert(arr[0] == 1);
assert(arr[1] == 4);
}
}
Remix Lite 尝试一下

END