"Delikler" için bir dizi kontrol etmek için basit yolu

4 Cevap php

Ben basit bir ilişkisel dizi var:

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

Ben verimli anahtarlarında delik bulmak gerekir. Tuşları tamsayılar olduğu garanti edilir.

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

findHole($ar,5)
> 6

Bunu yapmanın en kolay yolu nedir?

4 Cevap

Bu deneyin:

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

Lütfen findHole fonksiyonunun istenilen davranışı benim için net% 100 değildir, ama aşağıdaki kod parçacığını size tüm "kayıp" dizinleri olan bir dizi verecektir.

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

Kullanımı durumda bağlı olarak bu az ya da çok etkili olmayabilir. Döngüler ile çözümler PHP hızında çalışıyor olacak ise, varsayılan olarak, değer bazında yaklaşık geçirilen birden çok işlev çağrılarını ve dizileri kullanarak, ama bu işlevler yerel kod hızlarda çalışmaktadır.

Çantası kullanın, benchmark, vb

Tüm delikleri:

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;
}

Sadece dizi yoğunlaşmasına istiyorsanız, bu deneyin:

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