array_multisort in zwei Ebenen?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • array_multisort in zwei Ebenen?

    Guten Tag liebe Skriptkollegen =)

    Ich habe ein pikantes Problem und versuchen diesem mit der Funktion array_multisort Herr zu werden, was aber leider nicht klappt…

    Mein Array sieht folgendermaßen aus:

    PHP-Code:
    $arr = array(
     
    => array(
      
    'id' => 1,
      
    'char' => array(
       
    'name' => 'Berta'
      
    ),
     ),
     
    => array(
      
    'id' => 2,
      
    'char' => array(
       
    'name' => 'Anton'
      
    )
     )
    ); 
    Mein Ziel ist es, das Array so zu sortieren, dass es nach dem $arr[$i]['char']['name'] sortiert wird, sodass bei:

    PHP-Code:
    foreach ($arr as $row)
    {
     echo 
    $row['char']['name'].', ';

    aus Berta, Anton, dieses wird: Anton, Berta,


    Ist das möglich oder sollte ich gleich mein Skript umschreiben, um es irgendwie anders zu lösen?

    Mit meinem Wissen und der Doku über array_multisort komme ich auf jeden Fall nicht weiter


    Hoffe jemand hat eine rettende Idee
    Zuletzt geändert von ApoY2k; 07.09.2009, 13:45.
    This is what happens when an unstoppable force meets an immovable object.

  • #2
    Mit array_multisort() wirst du hier, meiner Meinung nach, nicht weit kommen. Da muss schon was eigenes her.
    Als Beispiel:
    PHP-Code:
    $arr = array(     array('id' => 1'char' => array('name' => 'Hans')),
                 array(
    'id' => 2'char' => array('name' => 'Gerd')),
                 array(
    'id' => 3'char' => array('name' => 'Berta')),
                 array(
    'id' => 4'char' => array('name' => 'Anton')),
                 array(
    'id' => 5'char' => array('name' => 'Zoan'))
            );

    function 
    KeySwap($sort_array) {
        for(
    $i 0$i sizeof($sort_array); $i++) {
            for(
    $j $i 1$j sizeof($sort_array); $j++) {
                
    $res strnatcasecmp($sort_array[$i]['char']['name'], $sort_array[$j]['char']['name']);
                    if(
    $res 0) {
                        
    $tmp $sort_array[$i];
                        
    $sort_array[$i] = $sort_array[$j];
                        
    $sort_array[$j] = $tmp;
                    }
            }
        }
        return 
    $sort_array;


    $arr KeySwap($arr);

    foreach(
    $arr as $row) {
        echo 
    $row['char']['name'].', ';
    }

    //Ausgabe: Anton, Berta, Gerd, Hans, Zoan, 
    Mit ein bisschen Nachdenken kein Problem
    Zuletzt geändert von deathcakeman; 07.09.2009, 15:17.
    *blubb*

    Kommentar


    • #3
      Wow, mit so einer Antwort hätte ich nun nicht gerechnet. Meistens bleibtst bei RTFM stehen ;-)

      Dennoch vielen Dank für deine Mühe, wohl grade Langeweile gehabt oder ist das Problem so einfach? Wie dem auch sei, ich kannte die Funktion strnatcasecmp() bisher noch nicht, vielleicht wäre ich mit dieser auch von alleine darauf gekommen.

      Ich meine aber zu verstehen, wie deine Funktion funktioniert. Sehe ich das richtig, dass sie sozusagen das Array durchläuft und immer zwei Einträge miteinander vergleicht und sie dann neu einsortiert, je nachdem ob sie vor oder nach dem vorigen stehen sollten?

      (Ich will schließlich auch verstehen, was mein Code macht…)
      This is what happens when an unstoppable force meets an immovable object.

      Kommentar


      • #4
        Da krige ich ja Pickel, wenn ich sowas kompliziertes sehe....



        Meine Alternative:
        *
        PHP-Code:
        <?php
        error_reporting
        (-1);
        ini_set('display_errors'TRUE);



        $arr = array( array('id' => 1'char' => array('name' => 'Hans')),
                      array(
        'id' => 2'char' => array('name' => 'Gerd')),
                      array(
        'id' => 3'char' => array('name' => 'Berta')),
                      array(
        'id' => 4'char' => array('name' => 'Anton')),
                      array(
        'id' => 5'char' => array('name' => 'Zoan'))
                );
                
        $sorter = function($a,$b)
                  {
                    return 
        strnatcasecmp($a['char']['name'], $b['char']['name']);
                  } ;     
                    
        usort($arr,$sorter);   

        ?>
        <pre>
         <?php
          var_export
        ($arr)
         
        ?>
        </pre>
        Wir werden alle sterben

        Kommentar

        Lädt...
        X