Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP是一种检查数组键是否连续的平滑方法_Php_Arrays - Fatal编程技术网

PHP是一种检查数组键是否连续的平滑方法

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

我需要检查数组的键。 如果它们是连续的,这很好,如果不是,我需要填写一些数据

e、 g

在这种情况下,缺少索引913。 为了简化示例,我只想用数字999填充缺少的数据

但是,我的解决方案有点马虎,无法正常工作:

$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);