假设您有一个带有数字键的数组,如
$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);
优点是可以将键移动任意值。
答案 0 :(得分:1)
你可以这样做。如果你不想使用循环。将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);
答案 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>';