用缺少的元素填充数组


Fill up array with missing elements

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

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

但我得到的数组与问题开始时相同。

您可以用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;
}

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

for($i=0; $i<=11;$i++){
    if(!array_key_exists($i,$array)){
      $array[$i] = 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
)

使用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
)

您需要浏览整个数组以查找设置缺少的键值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);