3 Stimmen

Wie sortiert man ein Array aus einer Datei (PHP)?

Ich habe hier eine Datei, die eine Liste von Datenbanknamen und der entsprechenden Größe enthält. Nun möchte ich die Größe von der größten zur kleinsten sortieren, und der Datenbankname und der Datenbankname soll bei der Anzeige mit angezeigt werden, ich benutze PHP. Kann mir jemand weiterhelfen?

Hier ist ein einfacher Code dafür:

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

Die Datei sieht wie folgt aus:

DatabaseName 300 KB 

Hinweis: $data[1] enthält die Größen. Sollte ich es auf einem Array platzieren? wie über den DB-Namen?

Antworten sind sehr willkommen =)

2voto

Paul Dixon Punkte 286600

Zuerst müssen Sie ein Array mit einem Element erstellen, nach dem Sie tatsächlich sortieren können, dann verwenden Sie usort oder ähnliches, um die Sortierung nach Ihren eigenen Kriterien durchzuführen.

//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");
    }
}

Sortieren Sie nun mit einer benutzerdefinierten Vergleichsfunktion, um auf der Grundlage dieser berechneten Größe von hoch nach niedrig zu sortieren:

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

usort($databases, "cmp");

2voto

mere-teresa Punkte 436

Sie können die file() PHP-Funktion hier.

Ihre Textdatei ist wie :

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

Ich glaube, Sie können die PHP-eigene Funktion für Arrays verwenden.

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

Siehe diesen Kommentar in der Dokumentation, die gleiche Struktur : http://fr2.php.net/manual/en/function.array-multisort.php#79491

Oder vielleicht müssen Sie das Array umdrehen, damit Sie die Größe im Index und den Namen im Wert haben.

1voto

Rob Knight Punkte 8244
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);
}

Dieser Code speichert Ihre Informationen in einem Array und führt dann eine benutzerdefinierte Sortierfunktion für Ihr Array aus, die es nach dem Wert von Element 1 im Array sortiert. Höhere Werte (größere Datenbankgrößen) werden an den Anfang der Liste sortiert.

Warnung: Ich habe diesen Code nicht wirklich getestet, aber Sie können die usort-Dokumentation ob es irgendwelche Fehler gibt, die behoben werden müssen.

Edit: d'oh, um ein paar Sekunden geschlagen :-)

0voto

Robert Punkte 8048

Haben Sie darüber nachgedacht, eine binäre Suchbaumstruktur anstelle eines Arrays zu analysieren? Auf diese Weise könnten Sie die Daten mit einem Baum-Traversal sortieren lassen und auch schnell nachschlagen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X