Mehrdimensinales Array sortieren

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

  • Mehrdimensinales Array sortieren

    Hoi,

    ich hab auch wiedermal ein Problem *g*

    Ich möchte folgenden Array nach einem Wert im Array sortieren.

    Bsp:
    PHP-Code:
    Array
    (
        [
    0] => Array
            (
                [
    rate] => Array()
                [
    cost] => Array
                    (
                        [
    sprache] => Array()
                        [
    sms] => Array()
                        [
    mms] => Array()
                    )

                [
    summe] => 107.5
            
    )
            
        [
    1] => Array
            (
                [
    rate] => Array()
                [
    cost] => Array
                    (
                        [
    sprache] => Array()
                        [
    sms] => Array()
                        [
    mms] => Array()
                    )

                [
    summe] => 95.3
            
    )
    )
    ..... 
    Der Array soll nach summe sortiert werden. Hab das ganze schon gelöst mit 2 Schleifen. (Die eine die die Summen in einen einfachen Array holt, diesen sortiert und dann nach der schlüsselreihenfolge die Werte in einem neuen Array zusammensetzt).

    array_multisort kann das leider auch nicht.

    Hat jemand nen Tipp für mich, wie ich das elegant lösen kann?

    Achso, Sortierung ist kleinste summe oben.

    thnx

  • #2
    Schau mal unter usort ins Handbuch.
    mein Sport: mein Frühstück: meine Arbeit:

    Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

    Kommentar


    • #3
      Hey, danke für den Tipp, leider versteh ich nicht ganz.

      Ich übergeb usort den Array den ich sortieren will und den Namen der Funktion, die auf jedes Element im Array angewandt werden soll.

      Gibt die Funktion 0 zurück, sind die beiden Elemten gleichwerte. Gibt sie -1 zurück wird das letze Elemt höher sortier, gibt sie 1 zurück, darunter. Oder hab ich das jetzt komplett falsch verstanden.

      Hier mein Code - Nehmt mal bitte meinen Fuß vom Schlauch runter....

      PHP-Code:
          function cmp_summe($a$b){
              
      $curr_val $a['summe'];
              
      $last_val $b['summe'];
              
              if (
      $curr_val == $last_val) return 0;
              return (
      $curr_val $last_val) ? -1;
          }

          
      usort($arr_sortier_mich"cmp_summe"); 

      Kommentar


      • #4
        leider versteh ich nicht ganz.
        Doch, tust du.


        Man könnte aber auch einfach

        function cmp_summe($a, $b){ return $a['summe'] - $b['summe']; }
        mein Sport: mein Frühstück: meine Arbeit:

        Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

        Kommentar


        • #5
          Hey,

          danke. Hab mittlerweile noch nen anderen Fehler in meinem Array gefunden. Ich depp geb number_formattede Werte zurück. Der Fehler ist mittlerweile behoben.

          Aber wenn ich es richtig versteh, auch wenn deine Funktion eleganter ist, machen beide das selbe, oder?

          Kann leider deine Version gerade nicht ausprobieren - aber meine tuts leider nicht. Reihenfolge ist die selbe wie vor dem usort.

          Kommentar


          • #6
            seltsam ... bei mir funktioniert beides.
            Sicher, dass Du das gleiche Array ausgibst, das Du vorher sortiert hast?
            PHP-Code:
            function cmp_summe($a$b){
            /**/
              
            return $a['summe']-$b['summe'];
            /*/
                    $curr_val = $a['summe'];
                    $last_val = $b['summe'];
                    if ($curr_val == $last_val) return 0;
                    return ($curr_val < $last_val) ? -1 : 1;
            /*/
                
            }
            $arr_sortier_mich = array(
              array (
            'rate' => Array(), 'cost' => Array('sprache' => Array(), 'sms' => Array(), 'mms' => Array()), 'summe' => 107.5),
              array (
            'rate' => Array(), 'cost' => Array ('sprache' => Array(), 'sms' => Array(), 'mms' => Array()), 'summe' => 95.3)
            );
            echo 
            '<pre><h1>vorher</h1>';
            var_dump($arr_sortier_mich);
            usort($arr_sortier_mich"cmp_summe");
            echo 
            '<h1>sortiert</h1>';
            var_dump($arr_sortier_mich);
            echo 
            '</pre>'
            mein Sport: mein Frühstück: meine Arbeit:

            Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

            Kommentar


            • #7
              Vielleicht ist das ja was für dich...

              PHP-Code:
              <?
              function multi_sort($input, $key, $type) {
                  if(is_array($input) && is_numeric($key)) {
                      foreach($input as $i_key => $i_value) {
                          $tmp_arr[$i_key] = $i_value[$key];
                      }
                      natcasesort($tmp_arr);
                      foreach($tmp_arr as $tmp_key => $tmp_val) {
                          $output[] = $input[$tmp_key];
                      }
                      if(strtolower($type) != "desc") return $output;
                      else return array_reverse($output);
                  }
              }

              $old_arr[0][0] = "Fritz";
              $old_arr[0][1] = "lalelu@domain.tld";
              $old_arr[0][2] = "http://www.test.de";

              $old_arr[1][0] = "Hugo";
              $old_arr[1][1] = "teeest@domain.tld";
              $old_arr[1][2] = "http://www.meinehomepage.de";


              echo "<u><b>Sortierung nach Name</b></u><br><br>";

              $new_arr =  multi_sort($old_arr, 0, "asc");
              //$new_arr =  multi_sort($old_arr, 0, "desc");

              foreach($new_arr as $key => $value) {
                  foreach($value as $key2 => $value2) {
                      echo $value2."<br>";
                  }
                  echo "<br>";
              }


              echo "<u><b>Sortierung nach Homepage</b></u><br><br>";

              $new_arr =  multi_sort($old_arr, 2, "asc");
              //$new_arr =  multi_sort($old_arr, 2, "desc");

              foreach($new_arr as $key => $value) {
                  foreach($value as $key2 => $value2) {
                      echo $value2."<br>";
                  }
                  echo "<br>";
              }
              ?>

              Kommentar


              • #8
                Hi,

                danke für eure Antworten.

                coolpeter: Eine Veriante mit schleifen hab ich, auch wenn du vielleicht nicht so allgemeingültig ist
                EDIT:
                Oh, is noch früh - multi-sort wäre auch noch ne idee... das muss ich mir nochmal angucken



                PHP-Code:
                $arr_sort = array();

                for(
                $i=0$i count($arr_cost_result); $i++){
                  
                $arr_sort[$i] = $arr_cost_result[$i]['summe'];
                }
                            
                asort($arr_sort);
                            
                $arr_new_cost_result = array();

                while(
                pos($arr_sort)){
                  
                $arr_new_cost_result[] = $arr_cost_result[key($arr_sort)];
                  
                next($arr_sort);


                Titus, ich werds nachher testen - vielleicht hab ich auch irgendwas dummes gemacht. Leider habe ich mom in der Datenbank nur einen aktiven Datensatz, da die gerade überarbeitet werden.... also gleich
                Zuletzt geändert von prego; 03.06.2005, 09:51.

                Kommentar


                • #9
                  Original geschrieben von prego
                  Leider habe ich mom in der Datenbank nur einen aktiven Datensatz, ...
                  OffTopic:
                  Jau, da lässt sich das Sortieren schlecht testen.
                  mein Sport: mein Frühstück: meine Arbeit:

                  Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

                  Kommentar


                  • #10
                    soo,

                    habs probiert...

                    Es funktioniert - ich war nur wiedermal zu doof.
                    Meine Sortiererei findet innerhalb einer Funktion statt, also kann ich ja schlecht "cmp_summe" einfach so aufrufen.

                    Nachdem ich da jetzt folgendes mache funktionierts....
                    PHP-Code:
                    <?php
                      usort
                    ($arr_cost_result, array("meine_klasse","cmp_summe"));
                    ?>
                    Besten dank euch allen.

                    Kommentar

                    Lädt...
                    X