Dosyasından (PHP) itibaren dizi sıralamak nasıl?

4 Cevap

I have a file here which contains list of database names and its corresponding size. Now I want to sort the size from the largest to the lowest, and the database name should go along it upon display.Am using PHP here.. Can anyone help me out?

İşte bunun için basit bir kod:

$file_name = test.txt
$handle = @fopen($file_name, "r");

if ($handle) {
    while (!feof($handle)) {

    $buffer = fgets($handle, 4096);
        $data = explode(" ",$buffer);
       echo $data[1]."\n";
    }
    fclose($handle);
}

Dosya bu gibi görünüyor:

DatabaseName 300 KB

Not: $ veri [1] boyutlarını içerir. I bir dizi yerleştirin gerekir? nasıl db ismi hakkında?

Yanıtlar çok takdir edilmektedir. =)

4 Cevap

Öncelikle size aslında sıralamak, sonra özel kriterlere göre sıralama yapmak için usort veya benzeri bir öğe ile bir dizi oluşturmak gerekir.

//first build up an array of databases with a unified size in bytes, ensuring
//we account for those postfixes like KB,MB,and GB
$databases=array();
while (!feof($handle)) {

    $buffer = fgets($handle, 4096);
    $data = explode(" ",$buffer);
    if (count($data)==3)
    {
        $size=$data[1];
        switch ($data[2])
        {
            case 'KB': $size*=1024; break;
            case 'MB': $size*=1024*1024; break;
            case 'GB': $size*=1024*1024*1024; break;
        }

        $data[3]=$size;
        $databases[]=$data; 
    }
    else
    {
        die("Bad line in file: $buffer");
    }
}

Şimdi sıralama bu hesaplanmış boyutuna göre yüksekten alçağa sıralamak için özel bir karşılaştırma fonksiyonu ile:

function cmp($a, $b)
{
    if ($a[3] == $b[3]) {
        return 0;
    }
    return ($a[3] < $b[3]) ? 1 : -1;
}

usort($databases, "cmp");

Sen file() PHP fonksiyonunu burada kullanabilirsiniz.

Metin dosyası gibi:

DatabaseName 300 KB
DatabaseName 300 KB
DatabaseName 300 KB
DatabaseName 300 KB

Ben diziler PHP yerli işlevini kullanabilirsiniz düşünüyorum.

$data = file('myfile.txt');

foreach($data as $one_line)
{
    $db[] = explode(" ",$one_line)
    //will have $db[0][0] = 'dbname';
    //will have $db[0][2] = '30';
    //will have $db[0][2] = 'KB';	
    //will have $db[1][0] = 'dbname';
    //will have $db[1][3] = '30';
    //will have $db[1][2] = 'KB';
}
array_multisort($db[1], SORT_NUMERIC, SORT_DESC);

Belgelerinde Yorumu görmek, aynı yapı: http://fr2.php.net/manual/en/function.array-multisort.php#79491

Ya da belki diziyi çevirmek zorunda, bu yüzden değer endeksi ve adını boyutuna sahip olabilir.

function databases_sort($a, $b) {
    if ($a[1] == $b[1]) { return 0; }

    return ($a[1] < $b[1]) ? -1 : 1;
}

$file_name = "test.txt";
$handle = @fopen($file_name, "r");

$databases = array();

if ($handle) { 
    while (!feof($handle)) {

        $buffer = fgets($handle, 4096);
        $data = explode(" ",$buffer);
        $databases[] = $data;
    //echo $data[1]."\n";
    }

    usort($databases, "databases_sort");

    foreach ($databases as $d) {
        echo $d[1];
    }

    fclose($handle);
}

Bu kod bir dizide bilgilerinizi saklar, daha sonra dizideki elemanının 1 değerine bunu sıralama, sizin dizide özel bir sıralama işlevi çalışır. Yüksek değerler (büyük veritabanı boyutları) listenin üst sınıflandırılmaktadır olsun.

Uyarı: Ben aslında bu kodu test değil, ama sabitleme gereken herhangi bir hata varsa size usort documentation görebilirsiniz.

Düzenleme: d'oh, birkaç saniye tarafından dövüldü :-)

Bir dizi yerine bir ikili arama ağaç yapısı ayrıştırma düşündünüz mü? Bu şekilde bir ağaç geçişi ile sıralanır verileri olabilir ve çok hızlı bir arama olabilir.