这次的合约代码我写的已经相当完善了,如果在完善一下,就是构造时创建管理员,并且方法均管理员可以调用即可
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
contract arrDelet {
uint[] public arr;
//另外一种数组删除的方法
function remevo(uint index) public {
//赋值覆盖,最后pop移除最后一位
arr[index] \= arr.length-1;
arr.pop();
}
//新的,学习一个映射,用于数组的映射
//先定义初始一个映射,用于规则数组的键值类似与php中的键与值
// 地址 数
mapping (address => uint) public userAdd;
// 地址 二维数组
mapping (address => mapping (address => bool)) public isuse;
//其他类型
mapping (string => mapping (string => int)) public isuse2;
//尝试给两个数组进行增删改查
function setmapp() external {
//一维数组赋值
userAdd[msg.sender] \= 123;
//二维数组赋值
isuse[msg.sender][address(this)] \= true;
isuse2["string"]["string"] \= 1;
//查询
//二维数组中的键值对的查询,key是地址,value是bool
//isuse[msg.sender][address(this)]
//删除,这里是通过索引,索引是地址,索引是键值对中的键值
// delete userAdd[msg.sender];
}
//学会二维数组后,开始学习实际的使用
//定义一个用户地址与余额的关系键
mapping (address => uint) private user;
//定义一个用户是否是我们的用户集里
mapping (address => bool) private iswe;
//定义一个数组,用于存储用户名
address[] private tels;
//添加一个用户到我们的集,并给予初始余额
function setWe(address _user,uint _qian) public returns (string memory){
//先判断是否在集里,不在再存储
if (!iswe[_user]){
//不在集里,添加进去 理解一下概念,这里实际是把值,赋值给了数组iswe的键为user的
iswe[_user] \= true;
//给余余额
user[_user] \= _qian;
//存入通讯集
tels.push(_user);
}
return "user is true";
}
//这里补上一个中间控制方法,在执行下面的函数时,都应该先判断用户是否在用户集里
modifier isweTel(address _select){
require (iswe[_select], "you are not in our set");
_;
}
//****构造操作映射和通讯集的方法tels
//通讯录有多长,就有多少个用户
function getlength() public view returns (uint){
return tels.length;
}
//查询某个用户的余额
function getQian(address _select) external view isweTel(_select) returns (uint) {
return user[_select];
}
//查第一个用户的余额
function getfastr() external view returns (uint){
return user[tels[0]];
}
//查询最后一个用户的余额
function getlast() external view returns (uint){
//-1 是索引是0开始,其实就是取数组最后一个
return user[tels[tels.length - 1]];
}
//根据第几个用户来查询余额
function getindex(uint index) public view returns (uint){
if (iswe[tels[index]] \== true){
return user[tels[index]];
}else {
revert("user is not in set");
}
}
//遍历数组中所有人的余额
function getAll() external view returns (uint[] memory){
//我们现在有根据索引来查,和获取长度,我们开始循环遍历
//定义一个uint来存储长度
uint userNum \= getlength();
//定义一个uint[] 来存储余额,这里注意,因为要push,所以是一个动态数组的初始化
uint[] memory userYue \= new uint[](userNum);
//开始循环 循环中不能使用push,不然会报错uint256 意思是不知道多大
for (uint i \= 0; i < userNum; i++){
userYue[i] \= getindex(i);
}
// 返回余额
return userYue;
}
/**
如果想返回余额和地址,就要在循环里新建映射和拼装数组,这种是非常消耗gas一般使用第三方语言辅助了,这里没必要写了
*/
}
