我有一个简单的关联数组:
$ar = array( 1=>'foo', 2=>'bar', 5=>'foobar', 8=>'barfoo' )
我需要有效地找到钥匙孔。密钥保证是整数。
findHole($ar)
> 0
findHole($ar,1)
> 3
findHole($ar,5)
> 6
最简单的方法是什么?
答案 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;
}