2017-07-18 31 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>';