检查数组中键“孔”的简单方法

时间:2010-03-09 21:51:34

标签: php arrays

我有一个简单的关联数组:

$ar = array( 1=>'foo', 2=>'bar', 5=>'foobar', 8=>'barfoo' )

我需要有效地找到钥匙孔。密钥保证是整数。

findHole($ar)
> 0
findHole($ar,1)
> 3

findHole($ar,5)
> 6

最简单的方法是什么?

4 个答案:

答案 0 :(得分:9)

试试这个:

function findHole($array, $key=0) {
    while (array_key_exists($key, $array)) {
        $key++;
    }
    return $key;
}

答案 1 :(得分:2)

findHole函数的所需行为并非100%清楚,但以下代码段会为您提供一个包含所有“缺失”索引的数组。

$ar = array( 1=>'foo', 2=>'bar', 5=>'foobar', 8=>'barfoo' );
$keys = array_keys($ar);
$missing_indexes = array_diff(range(0,max($keys)), $keys);
print_r($missing_indexes);

根据您的使用情况,这可能会降低效率,也可能不会降低效率。它使用多个函数调用,默认情况下数组按值传递,但这些函数以本机代码速度运行,而使用循环的解决方案将以PHP速度运行。

用例,基准等

答案 2 :(得分:1)

所有洞:

function GetHoles($arr)
{
    $holes = array();

    $max_value = max(array_keys($arr));
    for($i = 0; $i < $max_value; $i++)
    {
        if(!in_array($i, $keys)) $holes[] = $i;
    }

    return $holes;
}

答案 3 :(得分:0)

如果你只是想压缩数组,试试这个:

function FlattenArray( $o ) 
{ 
    $res = array(); 
    foreach($o as $v) 
    { 
        $res = array_merge($res, FlattenArray($v)); 
    } 
    return $res; 
}