假设您有一个数字键的数组,如
$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);