用缺少的元素填充数组

时间:2016-05-10 11:14:09

标签: php arrays

我有一个看起来像这样的数组:

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

但我只是在问题的开头得到了相同的数组。

5 个答案:

答案 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;
}

答案 1 :(得分:1)

如果您的数组键范围仅为11,则可以尝试使用以下代码。

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

答案 2 :(得分:0)

使用以下代码。

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
)

答案 3 :(得分: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
)

答案 4 :(得分:-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);