根据数组及函数的相关知识,写一个函数,将一个长度超过10的数组最后5项直接截取,不改变顺序变为前5项,如{1,2,3,4,5,6,7,8,9,10}变为{6,7,8,9,10,1,2,3,4,5}. 思路:先把数组截取相应的长度( array_slice ),再把2段数组拼接( array_merge )
时间: 2023-09-14 17:15:58 浏览: 33
好的,这是一个实现该功能的 PHP 函数示例:
```php
function shiftArray($arr) {
if (count($arr) <= 10) {
return $arr;
}
$first = array_slice($arr, 0, 5);
$last = array_slice($arr, -5);
return array_merge($last, $first);
}
```
该函数将输入的数组作为参数,如果数组长度小于等于10,直接返回原数组。否则,使用 array_slice() 函数将数组的前5项和后5项分别截取出来,然后使用 array_merge() 函数将它们拼接起来。最后返回结果。
可以使用以下代码测试该函数:
```php
$arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
$result = shiftArray($arr);
print_r($result); // 输出:Array ( [0] => 11 [1] => 12 [2] => 13 [3] => 14 [4] => 15 [5] => 1 [6] => 2 [7] => 3 [8] => 4 [9] => 5 )
```
该函数的输出结果应该为 `{11, 12, 13, 14, 15, 1, 2, 3, 4, 5}`。
相关问题
PHP 根据数组及函数的相关知识,写一个函数,将一个长度超过10的数组最后5项直接截取,不改变顺序变为前5项,如{1,2,3,4,5,6,7,8,9,10}变为{6,7,8,9,10,1,2,3,4,5}. 思路:先把数组截取相应的长度( array_slice ),再把2段数组拼接( array_merge )
好的,下面是 PHP 版本的代码:
```php
function moveLastItemsToFront($arr) {
$lastFive = array_slice($arr, -5);
$firstFive = array_slice($arr, 0, 5);
return array_merge($lastFive, $firstFive);
}
$arr = array(1,2,3,4,5,6,7,8,9,10);
$newArr = moveLastItemsToFront($arr);
print_r($newArr);
```
这个函数首先使用 `array_slice` 函数将原数组的后5项截取出来,再将原数组的前5项截取出来,最后使用 `array_merge` 函数将这两个数组拼接起来。然后可以将原数组传入这个函数,得到新的数组并打印输出,就可以得到您要求的结果了。
ERC20中的permit是一种批准而非转账的交易,用于授权指定地址可以代替token持有者进行转账操作。ERC20的permit函数返回一个bytes32类型的值,需要进行解析获取v、r、s值。下面是获取v、r、s值的步骤: 将返回值bytes32转换为bytes数组,然后将前12个字节截取掉,得到长度为32的bytes数组,这个数组包含了permit数据的前20个字节和后12个字节。 将这个bytes数组再转换为bytes20类型的值,得到授权目标地址。 将bytes数组的后12个字节截取掉,得到长度为20的bytes数组,表示授权过期时间。 将授权过期时间、授权目标地址、代币合约地址、授权者地址、授权数量、nonce值(授权者地址的交易次数)按照特定的顺序进行哈希,得到一个32字节的hash值。 使用授权者地址对哈希值进行签名,得到一个长度为65字节的bytes数组。 将bytes数组中的前32字节截取出来,得到r值;将接下来的32字节截取出来,得到s值;将最后一个字节截取出来,得到v值,请用js代码实现
以下是使用JavaScript实现获取ERC20 permit交易的v、r、s值的示例代码:
```javascript
const ethers = require('ethers');
// permit返回的bytes32类型的值
const permitData = '0x7e6e3dc9e3bbf3c7b8a5eaddb2616f6e3f8a0b7dbf4f7d3c2a2da7f5a3c3e7ff';
// 转换为bytes数组,并截取前12字节
const permitBytes = ethers.utils.arrayify(permitData).slice(12);
// 前20字节为授权目标地址
const spender = ethers.utils.getAddress('0x' + permitBytes.slice(0, 20).toString('hex'));
// 后20字节为授权过期时间
const deadline = parseInt('0x' + permitBytes.slice(20).toString('hex'), 16);
// ERC20合约地址
const tokenAddress = '0x...';
// 授权者地址
const owner = '0x...';
// 授权数量
const value = ethers.utils.parseUnits('100', 18);
// 授权者地址的交易次数
const nonce = 0;
// 构造permit数据
const permitDigest = ethers.utils.solidityKeccak256(
['bytes32', 'address', 'uint256', 'uint256', 'address', 'uint256', 'uint256'],
[ethers.utils.keccak256('Permit(address spender,uint256 value,uint256 nonce,uint256 deadline)'), tokenAddress, value, nonce, deadline, spender, value]
);
// 对permit数据进行签名
const provider = new ethers.providers.JsonRpcProvider('https://mainnet.infura.io/v3/...');
const signer = new ethers.Wallet('0x...', provider);
const signature = await signer.signMessage(ethers.utils.arrayify(permitDigest));
// 解析签名数据
const sig = ethers.utils.splitSignature(signature);
const r = sig.r;
const s = sig.s;
const v = sig.v;
```
注意需要替换掉示例代码中的ERC20合约地址、授权者地址、私钥等参数。