php – 切片数组的一部分并按值x引发数字键

假设您有一个数字键的数组,如

$ar = [0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd', 4 => 'e', 5 => 'f', 6 => 'g'];

和定义的偏移量为4($offset = 4).现在,您想要从偏移量开始切片该数组的一部分.

$slice = array_slice($ar, $offset, null, true);

而且您不仅要保留原始密钥,而且实际上将它们提高1,因此结果将是:

Array
(
    [5] => e
    [6] => f
    [7] => g
)

代替

Array
(
    [4] => e
    [5] => f
    [6] => g
)

当然,你可以循环遍历数组(foreach,array_walk)并重新分配所有键,例如:

$new_ar = [];
$raise_by = 1; // Could be any other amount
foreach ($slice as $key => $val) {
    $new_ar[$key + $raise_by] = $val;
}

但有没有办法在没有额外的外部循环和(重新)分配密钥的情况下做到这一点?像“在x位置切割数组并用x 1开始键”之类的东西?

编辑/可能的解决方案:

受到评论的启发,除了Brian在How to increase by 1 all keys in an array?的评论之外,我还看到了两种可能的解决方案

静态,短期和基本:

array_unshift($ar, 0);
$result = array_slice($ar, $offset + 1, null, true);

更灵活,但性能可能更差:

$shift = 1;
$slice = array_slice($ar, $offset, null, true);
$ar = array_merge(range(1, $offset + $shift), array_values($slice));
$result = array_slice($ar, $offset + $shift, null, true);

优点是可以将键移动任意值.

最佳答案 你可以这样做.如果你不想使用循环.使用array_combine,空数组范围为5-7

$ar = [0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd', 4 => 'e', 5 => 'f', 6 => 'g'];
$offset = 4;
$slice = array_slice($ar, $offset, null, true);
$slice = array_combine(range($offset+1, count($slice)+$offset), array_values($slice));//<--------check this

echo "<pre>";
print_r($slice);
点赞