2016-05-10 31 views
0

我有一個陣列,其看起來像這樣:填補了陣列與缺少的元素

array:6 [▼ 
    0 => 2 
    1 => 2 
    2 => 2 
    6 => 5 
    10 => 3 
    11 => 1 
] 

我想例如檢查數字範圍如果這些鍵存在於我的數組中,則爲0到11。如果不是我想創建一個缺少關鍵元素,並給它的值是0

所以我最終會得到一個這樣的數組:

array:6 [▼ 
    0 => 2 
    1 => 2 
    2 => 2 
    3 => 0 
    4 => 0 
    5 => 0 
    6 => 5 
    7 => 0 
    8 => 0 
    9 => 0 
    10 => 3 
    11 => 1 
] 

我想是這樣的:

$range = range(0,11); 

foreach($myArray as $key => $value){ 
    if(!in_array($key, $range)){ 
    $myArray[$key] = 0; 
    } 
} 

但我只是得到與問題開始時相同的數組。

+1

你在哪裏堅持這樣做? – Rizier123

+0

你需要填寫缺少'數組鍵'與'值0'? –

回答

3

您可以創建一個與array_fill_keys()陣列並將其與range()所需的密鑰數量一起傳遞給它,並用0填充數組。之後,您可以用array_replace()替換陣列中已有的所有元素。

<?php 

    $array = [2 => 3, 5 => 2, 11 => 7]; 

    $result = array_replace(array_fill_keys(range(0, 11), 0), $array); 
    print_r($result); 

?> 

與您的代碼的問題是,你只在你的數組中的元素循環。所以如果你只有3個元素,你只需循環這3個元素。

如果你想修復你當前的代碼,你將不得不循環遍歷$range,然後檢查數組中是否存在鍵而不是值,如果是,請使用它的值,否則使用值創建元素0

固定碼:

$range = range(0,11); 
$result = []; 

foreach($range as $key){ 
    if(isset($array[$key])) 
     $result[$key] = $array[$key]; 
    else $result[$key] = 0; 
} 
+0

是的,就是這樣,謝謝! – Marco

1

如果您只有數組鍵的範圍只有11,您可以嘗試下面的代碼。

for($i=0; $i<=11;$i++){ 
    if(!array_key_exists($i,$array)){ 
     $array[$i] = 0; 
    } 
} 
+2

使用'max(array_keys($ array))'而不是'11',它會在數組中找到最大密鑰;你不需要檢查最後一項('11'),因爲它總是存在。 – ssnake

+0

你是對的,謝謝。 –

+0

使用你的方法,它會在最後附加所有的0個鍵。 – RJParikh

-1

你需要瀏覽設置丟失的鑰匙值爲0整個陣列我做一個函數這樣做,檢查索引丟失然後設置爲0。

$array = array('0' => 2, '1' => 2, '2' => 2, '6' => 5, '10' => 3, '11' => 1); 
function cleanArray(&$array){ 
    end($array); 
    $max = key($array); //Get the final key as max! 
    for($i = 0; $i < $max; $i++){ 
     if(!isset($array[$i])){ 
      $array[$i] = 0; 
     } 
    } 
} 

cleanArray($array); 
ksort($array); 
print_r($array); 
-1

使用下面的代碼。

1)使用key()我們找到最後一個鍵號。

2)使用array_key_exists(key,array)檢查密鑰是否存在於數組中。

3)將它填入新數組中。

$arr = array(
    0 => 2, 
    1 => 2, 
    2 => 2, 
    6 => 5, 
    10 => 3, 
    11 => 1, 
    ); 
end($arr); 
$endKey = key($arr); 

for($i=0;$i<$endKey;$i++) 
{ 
    if(!array_key_exists($i, $arr)) 
    { 
     $newarr[$i] = 0; 
    } 
    else 
    { 
     $newarr[$i] = $arr[$i]; 
    } 
} 

輸出

Array 
(
    [0] => 2 
    [1] => 2 
    [2] => 2 
    [3] => 0 
    [4] => 0 
    [5] => 0 
    [6] => 5 
    [7] => 0 
    [8] => 0 
    [9] => 0 
    [10] => 3 
) 
+0

爲什麼減投票?它的工作我已經檢查和測試。 @Marco – RJParikh

0

使用array_diff_keyarray_fill函數的溶液:

// $arr is your initial array 
$diff = array_diff_key(array_fill(0,12,0), $arr); 
$result = $arr + $diff; 
ksort($result); 

print_r($result); 

輸出:

Array 
(
    [0] => 2 
    [1] => 2 
    [2] => 2 
    [3] => 0 
    [4] => 0 
    [5] => 0 
    [6] => 5 
    [7] => 0 
    [8] => 0 
    [9] => 0 
    [10] => 3 
    [11] => 1 
)