我有一个数组,它看起来像这样:
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_key
和array_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);