PHP sıralanmış bir dizi tutulması

4 Cevap php

Ben büyük bir CSV okur ve bazı eylemleri gerçekleştiren bir PHP komut dosyası var, ama "username" alan benzersiz ise. CSV yani sadece CSV girişi değiştirerek, birden fazla komut kullanıldığı benzersiz adlarını içeren bir seçenek değildir.

(Ben merak ediyorum) çok temel program akışı şöyle:

$allUsernames = array();
while($row = fgetcsv($fp)) {
    $username = $row[0];
    if (in_array($username, $allUsernames)) continue;
    $allUsernames[] = $username;
    // process this row
}

Bu CSV aslında oldukça büyük olabilir bu yana, beni düşünme var ki in_array biraz. Bir üyesi için bir dizi aracılığıyla arıyor en ideal durum, zaten sıralanır ise, yani how would you build up an array from scratch, keeping it in order? Sırayla bir kez, in_array(), muhtemelen dizisi sıralanır bilmiyor düşünüyor kullanarak daha aramak için daha verimli bir yol olurdu?

4 Cevap

Sırayla dizi tutarak, ama nasıl optimizasyon bu tür hakkında değil mi? I isset() bir dizi anahtar için tahmin ediyorum in_array() arayışı daha hızlı olmalıdır.

$allUsernames = array();
while($row = fgetcsv($fp)) {
  $username = $row[0];

  if (isset($allUsernames[$username])) {
    continue;
  } else {
    $allUsernames[$username] = true;

    // do stuff
  }
}

Sıralı düzende sıfırdan bir dizi oluşturmak için yolu bir ekleme tür. PHP-ish pseudocode:

$list = []
for ($element in $elems_to_insert) {
     $index = binary_search($element, $list);
     insert_into_list($element, $list, $index);
}

O aslında sadece ayıklanmamış amacıyla bir dizi oluşturmak için daha hızlı çıkmak ve daha sonra quicksort kullanabilirsiniz rağmen (PHP'nin yerleşik sıralama fonksiyonları quicksort kullanın)

Ve sıralı listeye bir öğe bulmak için:

function binary_search($list, $element) {
    $start = 0;
    $end = count($list);
    while ($end - $start > 1) {
        $mid = ($start + $end) / 2;
        if ($list[$mid] < $element){
            $start = $mid;
        }
        else{
            $end = $mid;
        }
    }
    return $end;
}

Bu uygulama ile eleman dizide değilse, bu da girilmelidir noktası bulacaksınız beri, istediğiniz elemanı ise $list[$end] görmek için test etmek lazım. Önceki kod örneği ile tutarlı olurdu yüzden ben bu şekilde yaptım. Eğer isterseniz, işlevi kendisi $list[$end] === $element kontrol edebilir.

Php dizi tipi sıralı bir harita (php array type). Eğer tuşları olarak da ints veya dizeleri geçmek varsa, sıralı bir harita olacak ...

Yukarıdaki linke öğe 6. gözden geçirin.

in_array () sıralı bir dizi olan fayda etmez. Bağlantılı bir liste sanki PHP sadece tüm dizi boyunca yürür.