2017-07-18 68 views
4

提高数字键比方说,你有数字键像切片部分和值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键”?

编辑/可能的解决方案:

所作的评论的鼓舞下,我看到了另外2个可能的解决方案,以布莱恩的评论中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,否则你会覆盖下一个值 – Alchalade

+0

嗯,这就是为什么我将它分配给一个新的空数组。 – antesoles

+1

我不认为你会发现比你的解决方案更好或更快。看看这里:https://stackoverflow.com/questions/12715514/how-to-increase-by-1-all-keys-in-an-array –

回答

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); 
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说。检查它是否不影响你的输出。

0

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

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

我不明白这可以与array_splice,但你的灵感我使用'array_unshift($ ar,0);'然后用'$ offset + 1'切片。 – antesoles

+0

https://www.w3schools.com/php/func_array_splice.asp这个链接将向你展示array_splice如何帮助你,另一种方式是array_unshift,就像你提到的那样。 – Osama

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>';