PHP是一种检查数组键是否连续的平滑方法
我需要检查数组的键。 如果它们是连续的,这很好,如果不是,我需要填写一些数据 e、 g 在这种情况下,缺少索引9和13。 为了简化示例,我只想用数字999填充缺少的数据 但是,我的解决方案有点马虎,无法正常工作:PHP是一种检查数组键是否连续的平滑方法,php,arrays,Php,Arrays,我需要检查数组的键。 如果它们是连续的,这很好,如果不是,我需要填写一些数据 e、 g 在这种情况下,缺少索引9和13。 为了简化示例,我只想用数字999填充缺少的数据 但是,我的解决方案有点马虎,无法正常工作: $oldK = 0; foreach($array as $k=>$entry) { if($oldK !== $k) { $array[$oldK] = 999; } $oldK ++; } 产生以下输出: Array
$oldK = 0;
foreach($array as $k=>$entry)
{
if($oldK !== $k)
{
$array[$oldK] = 999;
}
$oldK ++;
}
产生以下输出:
Array
(
[0] => 0
[1] => 1
[2] => 8
[3] => 0
[4] => 0
[5] => 0
[6] => 0
[7] => 0
[8] => 0
[9] => 999
[10] => 999
[11] => 999
[12] => 999
[13] => 999
[14] => 0
[15] => 0
)
是否有一种平滑的方法可以工作?您可以使用创建数组,然后使用原始数组中的数据填充(覆盖):
$keys = array_keys($arr);
$new = array_fill(min($keys), max($keys),999);
foreach($new as $k => &$v)
if (isset($arr[$k])) $v = $arr[$k];
请注意&
以更改循环数组中的值
另一种实现方法是使用+
操作符。如果您需要订购,请在之后使用:
$keys = array_keys($arr);
$new = $arr + array_fill(min($keys), max($keys),999);
ksort($new);
现场示例您可以结合使用:
首先通过array\u keys
抓取键应能使其适用于任意数量的元素(前提是键显然是数字键)
演示:
在上面的代码中,您正在推进数组指针$k
,而无需等待键按顺序填充。比较$oldK!==$k
,$k
需要静止,直到$oldK
到达它。下面是固定代码,我们在其中循环数组的键并进行检查
$keys = array_keys($array);
$oldK = 0;
while(current($keys) !== false){
$key = current($keys);
if($key === $oldK) next($keys);
else $array[$oldK] = 999;
$oldK++;
}
ksort($array);// to arrange them in sorted order
演示:这应该是您的完整解决方案
//4 and 5 is missing in given array1
$arr1 = [0 => 0, 1 => 0, 2 => 8, 3 => 0, 11 => 0, 12 => 0, 15 => 0];
//Create a new array
$arr2 = range(1,max($arr1));
// use array_diff to get the missing numbers and create a new array with them
$missingNumbers = array_diff($arr1,$arr2);
$keys = array_keys($missingNumbers);
$Sonuc = array_replace(array_fill(min($keys), max($keys), 999), $arr1);
print_r($Sonuc);
演示:关于使用
min
和max
函数的好观点。您的答案比我的简单谢谢,所有答案都像预期的-->一样工作,但我最喜欢这个,因为它只在一行中+事实上,每个答案都有一个小小的修正:array\u fill
的第二个参数应该是max($keys)-min($keys)
,这样在任何情况下都能起作用。@vivek\u 23说得好!在我的情况下,数组总是从0
开始,因此此解决方案适合,但在其他情况下,您的解决方案可能更好。@toffler此答案也适用。只需将此解决方案中的所有min($keys)
替换为0
。谢谢,所有答案对每个答案都像预期的+1一样工作。谢谢,我喜欢你从我的示例+1中做出答案!不过,我已经接受了另一个答案。@toffler,没关系。我很高兴能为您指出正确的方向:)
$oldK = 0;
foreach($array as $k=>$entry)
{
if($oldK !== $k)
{
$array[$oldK] = 999;
}
$oldK ++;
}
$keys = array_keys($array);
$oldK = 0;
while(current($keys) !== false){
$key = current($keys);
if($key === $oldK) next($keys);
else $array[$oldK] = 999;
$oldK++;
}
ksort($array);// to arrange them in sorted order
//4 and 5 is missing in given array1
$arr1 = [0 => 0, 1 => 0, 2 => 8, 3 => 0, 11 => 0, 12 => 0, 15 => 0];
//Create a new array
$arr2 = range(1,max($arr1));
// use array_diff to get the missing numbers and create a new array with them
$missingNumbers = array_diff($arr1,$arr2);
$keys = array_keys($missingNumbers);
$Sonuc = array_replace(array_fill(min($keys), max($keys), 999), $arr1);
print_r($Sonuc);