PHP Zusammenhängend dynamisch sortieren



  • Hey!

    Ich frage mich, wie man es dynamisch hinbekommt, mehrere Arrays zusammenhängend zu sortieren.

    Beispiel:

    Name1 16 Male
    Name2 12 Male
    Name3 18 Female

    Name1, Name2 und Name3 stehen dabei in $names, 16, 12 und 18 in $ages usw...
    Nun möchte ich mit asort() nach Alter sortieren. Dann sollte das rauskommen:

    Name2 12 Male
    Name1 16 Male
    Name3 18 Female

    Aber wie gestalte ich das dynamisch? Der zu sortierende Wert soll per GET übergeben werden.

    Also das hab ich selber rausgefunden:

    <?php
    $names = array("Susi", "KleinerMax", "GroßerMax");
    $ages = array(18, 12, 16);
    $genders = array("Female", "Male", "Male");
    
    // Alter sortieren
    asort(&$ages);
    foreach ($ages AS $key => $age)
        echo $names[$key] . " " . $age . " " . $genders[$key] . "<br>";
    ?>
    

    Allerdings wäre es ja blöd, für jeden zu sortierenden Wert eine eigene, angepasste foreach Schleife zu schreiben.

    Wie mache ich das ganze schön dynamisch?

    MfG



  • Pack doch einfach die drei Arrays in eines:

    $users = array(
       array('Susi', 18, 'Female'),
       array('Kleiner Max', 12, 'Male'),
       array('Großer Max', 16, 'Male')
    );
    

    Dann musst du nur noch in einer Schleife das Array selbst durchgehen; ob asort damit umgehen könnte, weiß ich nicht.

    Generell: Was zusammen gehört sollte auch zusammen sein. Sprich: Kapselung. Du könntest auch anstelle von Arrays eine Klasse für die Personen (ein Objekt pro Person) verwenden. Das wäre objektorientierungstechnisch sicher am elegantesten.



  • Ich würd das auch so machen, wie árn[y]ék vorgeschlagen hat. Alles in ein Array oder machs OO. Um das dann zu sortieren hilft diese Funktion: http://de.php.net/manual/de/function.usort.php



  • Danke, ich hab das jetzt ganz gut hinbekommen:

    $sort = $_GET['sort'];
    
    function compare($a, $b)
    {
        global $sort;
    
        if(is_string($a))
            return !strcmp($a[$sort], $b[$sort]);
        else
        {
            if($a[$sort] == $b[$sort])
                return false;
    
            return ($a[$sort] < $b[$sort]) ? true : false;
        }
    }
    
    if(isset($sort))
        usort($data, "compare");
    

    $data ist dabei nun ein mehrdimensionales array.
    Aber: Wie kehre ich die Ausgabe um? Hab schon ein ! vor strcmp probiert, aber es beginnt immer bei Z.

    MfG



  • Keiner nen Plan?
    Wie sortiere ich von A-Z anstatt von Z-A?

    Und warum wird so ungenau sortiert: (Jetzt absichtlich von A-Z eingetragen)

    ADK-GaminG.De Bruchbude #1
    ADK-GaminG.De Bruchbude #2
    BLACK PAJAMAS by Vulc@n
    CE 1.5 {DP}www.DoomPlatoon.de

    ...

    VC - Test
    Warriors of Honor
    [NSG] Public Coop - GER
    [SR] Server 1

    Und dann danach plötzlich noch:

    cbf. gaming public
    daddou
    jen pro {SAS}
    lol
    pRoG4meR$
    vietcong-friends.de
    wecome gentlemen
    www.GerWar.de

    Warum kommt etwas was mit c anfängt erst nach dem Alphabet und nach [ ?
    Das sollte doch nach "BLACK PAJAMAS by Vulc@n" stehen...

    Könnts euch ja mal ansehen: (Servername)
    http://thearchifamily.com/?page=serverlist&sort=3

    Wie kann ich meinen code verbessern?
    Danke,
    MfG



  • 😕



  • Die dir seltsam anmutende Sortierung liegt darin begründet, dass für den Computer "A" und "a" unterschiedliche Buchstaben mit jeweils eigenem Index im Zeichensatz sind, wobei die Großbuchstaben vor den Kleinbuchstaben kommen. Willst du dass verhindern, musst du bei sämtlichen Stringvergleichen ein strtolower() oder ein strtoupper() auf die zu vergleichenden Strings anwenden. Dann matcht "A" auf "a" und du kriegst die "richtige" Sortierung. Allerdings musst du deine Schleife dann überarbeiten, denn du willst ja mit einheitlicher Groß- oder Kleinschreibung abkürzen, nicht aber die umgewandelten Wörter speichern 😉

    Nochmal im Klartext:

    $a = 'Test';
    $b = 'test';
    // $a != $b
    // strtolower($a) == strtolower($b)
    


  • Oh sorry, meine Funktion sieht schon längst so aus:

    (strcasecmp)

    function compare($a, $b)
    {
        global $sort;
    
        if(is_string($a))
            return strcasecmp($a[$sort], $b[$sort]);
        else
        {
            if($a[$sort] == $b[$sort])
                return false;
    
            return ($a[$sort] < $b[$sort]) ? true : false;
        }
    }
    

    Trotzdem kein Unterschied.
    MfG



  • Es gibt viele Möglichkeiten das zu realisieren.
    1. Du sortierst das Array (nach dessen Werten sortiert werden soll), merkst dir die Reihenfolge der Keys und sortierst die anderen Arrays nach der Reihnefolge der Keys.
    2. Du nimmst ein 3D Array: array[name][age][sex]
    Dafür könnte man sich einen simplen Sortieralgorithmus schreiben und muss sich nicht um 3 verschiedene Array kümmern.



  • Aber ich hab doch schon alles fertig. Es wird halt nur nicht ganz korrekt sortiert.



  • Keiner ne Ahnung, wie ich mittels usort() anstatt von Z - A von A - Z sortieren kann?

    function compare($a, $b) 
    { 
        global $sort; 
    
        if(is_string($a)) 
            return strcasecmp($a[$sort], $b[$sort]); 
        else 
        { 
            if($a[$sort] == $b[$sort]) 
                return false; 
    
            return ($a[$sort] < $b[$sort]) ? true : false; 
        } 
    }
    

    😕

    MfG


Anmelden zum Antworten