切片数组的一部分并按值x提高数字键

时间:2017-07-18 10:24:12

标签: 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
(
    [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);

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

4 个答案:

答案 0 :(得分:1)

你可以这样做。如果你不想使用循环。将array_combine5-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);

答案 1 :(得分:0)

你可以通过这个来得到答案,

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

$slice = array_slice($ar, '4', null, true);


    $new_arr = array();
    foreach($slice as $key => $val)
    {
        $key = $key + 1;
        $new_arr[$key] = $val;
        $key++;
    }

但是,请检查一次,如@Alchalade所说。检查它是否不影响您的输出。

答案 2 :(得分:0)

在位置0处插入原始数组的新值,然后对其进行切片,以便每个键根据该值增加1。

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

答案 3 :(得分: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>';