Php 对数组的一部分进行切片,并将数字键的值提高x

Php 对数组的一部分进行切片,并将数字键的值提高x,php,arrays,Php,Arrays,假设您有一个带有数字键的数组,如 $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 (

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

$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在

静态、简短和基本:

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\u将
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);
$ar=[0=>a',1=>b',2=>c',3=>d',4=>e',5=>f',6=>g'];
$offset=4;
$slice=array\u slice($ar,$offset,null,true);

$slice=数组_组合(范围($offset+1,计数($slice)+$offset),数组_值($slice))// 你可以从这里得到答案

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

但是,请按照@Alchalade的指示检查一下。检查它是否不影响您的输出。

在位置0处为原始数组插入一个新值,然后对其进行切片,使每个关键点根据该值增加一个

<?php
$ar = array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd', 4 => 'e', 5 => 'f', 6 => 'g');
$ar = array_combine(
        array_map(function ($key) { return ++$key; }, array_keys($ar)),
        $ar
);
$offset = 4;
$sliced = array_slice($ar, $offset, count($ar), TRUE);
echo '<pre>';print_r($sliced);echo '</pre>';

您的循环可能很危险。您必须从头开始向键添加1,否则,您将覆盖下一个值。这就是为什么我将它分配给一个新的空数组。我认为您不会找到比您的解决方案更好或更快的解决方案。看这里:我不知道这如何能与array\u splice一起工作,但你启发我使用
array\u unshift($ar,0)和切片,然后使用
$offset+1
。此链接将向您展示array_splice将如何帮助您,另一种方法是您提到的array_unshift。
<?php
$ar = array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd', 4 => 'e', 5 => 'f', 6 => 'g');
$ar = array_combine(
        array_map(function ($key) { return ++$key; }, array_keys($ar)),
        $ar
);
$offset = 4;
$sliced = array_slice($ar, $offset, count($ar), TRUE);
echo '<pre>';print_r($sliced);echo '</pre>';