Bir dizinin ilk kullanılabilir kimliğini bulma

5 Cevap php

Böyle bir dizi verilen:

Array => (
  [0] => 1,
  [1] => 2,
  [2] => 3,
  [3] => 5,
  [4] => 6
)

O diziye ilk 'kullanılabilir' kimliğini bulmak için en kolay yolu nedir - bu dizideki ilk değer [1,2,3...n] bu dizide yok, değil mi? Bu durumda, doğru cevap olurdu 4.

Bazı while döngüler veya geçici değişkenler türlü kullanarak bunu yapabilirsiniz ama bu biraz dağınık, bu yüzden herkes bir 'akıllı' çözüm ile gelip görmek için ilgileniyorum.

5 Cevap

Gerçekten dizi sıralama ve onunla geçiyor, delikler arıyor dışında bir şey kadar düşünemiyorum.

Belki bir şey gibi:

sort($array);
$next_available = array_shift($array);
foreach($array as $_k) {
    ++$next_available;
    if($_k > $next_available) {
        break;
    }
}
echo "Next available index: {$next_available}";

Bu bazı döngü daha az dağınık olduğuna inanmıyorum, ama burada benim yapmacık bir örnek şöyle:

sort( $array );
$range = range( reset( $array ), end( $array ) );
$diff = array_diff( $range, $array );
$result = null != ( $result = array_shift( $diff ) ) ? $result : end( $array ) + 1;

Bu büyü biraz, ama hile yapar:

$values = array_values($id_array);
$values[] = max($values) + 1;
$combined = array_values(array_flip($values) + array_keys($values));
$missing = isset($combined[count($values) + 1])
    ? $combined[count($values) + 1]
    : end($values);

Bunun avantajı, önemli ölçüde hızlı olmasıdır. Kullanarak sorunu range(), küçük bir dizideki tek büyük anahtar array_diff() çok yavaş olacağını olacaktır. Hiç boşluk kimlikleriyle varsa ek olarak, bu bir sonraki tuşa dönecektir (ya da bunu tercih ediyorum buysa sen, end($values) false nihai değişebilir).

Cleverness rağmen, hala sadece dizi yineleme daha yavaş. Ama array_diff() (hatta olmadan range()), çok daha yavaş fazla olacaktır.

diziniz yalnızca sayısal anahtarı ve deliksiz kullanmak, yapabileceğiniz $next_id = count($your_array)

delik varsa, ou deneyebilirsiniz

$keys = array_keys($your_array);
rsort($keys);
$next_id = empty($keys)?0:($keys[0]+1);