Tobias S: array_multisort

Hallo!

Vorne weg: ich hab noch kaum was mit PHP gemacht, also sind Anfängerfehler durchaus möglich!

Ich lese ein 2 dimensionales Array von einem kleinen Formular ein. Dann soll innerhalb der Zeilen sortiert werden, die Zeilenreihenfolge aber gleich bleiben. Dann das ganze ausgeben.

Mein Code:
--------------------------------------------

  
<table>  
<?php  
 // 1) in Array schreiben (2-dimensional: AnzTips*6)  
 $tips = array(  
  "Tipp 1" => array($_REQUEST["b1"],$_REQUEST["b2"],$_REQUEST["b3"],$_REQUEST["w1"],$_REQUEST["w2"],$_REQUEST["w3"]),  
  "Tipp 2" => array($_REQUEST["b1"],$_REQUEST["b2"],$_REQUEST["b3"],$_REQUEST["w1"],$_REQUEST["w4"],$_REQUEST["w5"]),  
  "Tipp 3" => array($_REQUEST["b1"],$_REQUEST["b2"],$_REQUEST["b3"],$_REQUEST["w1"],$_REQUEST["w6"],$_REQUEST["w7"]),  
  "Tipp 4" => array($_REQUEST["b1"],$_REQUEST["b2"],$_REQUEST["b3"],$_REQUEST["w2"],$_REQUEST["w4"],$_REQUEST["w6"]),  
  "Tipp 5" => array($_REQUEST["b1"],$_REQUEST["b2"],$_REQUEST["b3"],$_REQUEST["w2"],$_REQUEST["w5"],$_REQUEST["w7"]),  
  "Tipp 6" => array($_REQUEST["b1"],$_REQUEST["b2"],$_REQUEST["b3"],$_REQUEST["w3"],$_REQUEST["w4"],$_REQUEST["w7"]),  
  "Tipp 7" => array($_REQUEST["b1"],$_REQUEST["b2"],$_REQUEST["b3"],$_REQUEST["w3"],$_REQUEST["w5"],$_REQUEST["w6"])  
 );  
  
 // 2) Array sortieren (innerhalb der Tips)  
 array_multisort($tips['Tipp 1'],$tips['Tipp 2'],$tips['Tipp 3'],$tips['Tipp 4'],$tips['Tipp 5'],$tips['Tipp 6'],$tips['Tipp 7']);  
  
 // 3) Ausgabe  
 foreach ($tips as $key => $zahl)  
 {  
  print "   <tr style=\"border:1px solid #888\">\n";  
  print "      <td width=\"60\">$key:</td>\n";  
  foreach ($tips[$key] as $index)  
  {  
   print "      <td width=\"20\" style=\"width:20px;text-align:center;spacing:4px;border:1px solid #888\">$index</td>\n";  
  }  
  print "   </tr>\n";  
 }  
?>  
</table>  

--------------------------------------------

Ich finde leider den Fehler nicht, aber die sortierung passt nicht. Nochmal: es soll nach den Formular-Werten sortiert werden... ich vermute hier den Fehler, weil wenn ich statt den $_REQUEST gleich Zahlen einsetze, funktioniert es!

Danke für eure Hilfe, mfg, Tobias

  1. hi,

    Ich lese ein 2 dimensionales Array von einem kleinen Formular ein. Dann soll innerhalb der Zeilen sortiert werden, die Zeilenreihenfolge aber gleich bleiben. Dann das ganze ausgeben.

    array_multisort sortiert Spaltenarrays.
    Für Zeilenarrays eignet sich usort mit einer selbstdefinierten Vergleichsfunktion besser.
    http://forum.de.selfhtml.org/archiv/2006/11/t140321/#m911851

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hmm...

      Also ich habe mir deinen Archiv-Link angesehen und die usort Funktion auch hier nocheinmal: http://manuals.phpforum.de/php/function.usort.php

      Das dortige Beispiel für multidimensionale Arrays funktioniert aber bei mir nicht!? Gibt's dafür eine Erklärung, außer, dass es dort falsch angewendet ist? Habe es 1:1 bei mir reinkopiert und es liefert als output "$fruits[0]: Trauben $fruits[1]: Zitronen $fruits[2]: Äpfel " und nicht die gewünschte sortierte Liste.

      Das usort verstehe ich leider selbst auch nicht wirklich :-( Kannst du mir das kurz erklären bezogen auf mein Beispiel?

      Und dann noch: Geht es mit array_multisort wirklich nicht? Dazu hatte ich nämlich auch Beispielcode den ich an meines angepasst habe. In dem Beispiel klappt das genau wie ich es haben wollte...:

        
      -------------  
      <?  
      $stadt=array(  
         "Berlin"=>array("Maier","Schmidt","Schulze","Erdmann"),  
         "Bonn"=>array("Lehmann","Martinez","Zumkeller","Fritsche"),  
         "Freiburg"=>array("Binsenteich","Knobloch","Erzengel","Dichter")  
      );  
        
      array_multisort($stadt['Berlin'],$stadt['Bonn'],$stadt['Freiburg']);  
        
      foreach ($stadt as $key=>$name)  
      {  
         print "<br><font color=red>In $key wohnen</font> <br>--------<br>";  
        
         foreach ($stadt[$key] as $index)  
         {  
            print "$index <br>";  
         }  
      }  
      ?>  
      -------------  
      
      

      Danke, mfg, Tobias

      1. hi,

        Also ich habe mir deinen Archiv-Link angesehen und die usort Funktion auch hier nocheinmal: http://manuals.phpforum.de/php/function.usort.php

        Das dortige Beispiel für multidimensionale Arrays funktioniert aber bei mir nicht!? Gibt's dafür eine Erklärung, außer, dass es dort falsch angewendet ist?

        Hast du die Vergleichsfunktion denn auch so angepasst, dass sie zwei Elemente deines Arrays vergleicht?

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Naja, um die Funktion mal kennenzulernen hab ich die dortige Funktion genau übernommen. Also das mit den Früchten ;-)

          Aber sie gibt eben bei mir nichtmal das aus was sie soll. Ich hab das Problem aber mittlerweile schon durch 1dim => sort => in 2 dim schreiben gelöst.

          Danke trotzdem, mfg Tobias

  2. Hi
    »»wenn ich statt den $_REQUEST gleich Zahlen einsetze, funktioniert es!
    Angesichts dieser Aussage würde ich mal die Werte in Zahlen umwandeln.
    Also überall so:
    [code=php]<?
    //(...)
    array((int)$_REQUEST["b1"],(int)$_REQUEST["b2"],(int)$_REQUEST["b3"] //(...)[/code]
    (ich habe den Code allerdings nicht durchgelesen).

    Außerdem ist es möglich Textfelder direkt als Array einzulesen, in HTML steht dann:
    [code=html]<input type="text" name="Tipps[Tipp_1][0]">
    <input type="text" name="Tipps[Tipp_1][1]">
    <input type="text" name="Tipps[Tipp_1][2]">
    <!-- (...) -->
    <input type="text" name="Tipps[Tipp_2][0]">
    <input type="text" name="Tipps[Tipp_2][1]">
    <input type="text" name="Tipps[Tipp_2][2]">
    <!-- (...) -->
    <input type="text" name="Tipps[Tipp_7][4]">
    <input type="text" name="Tipps[Tipp_7][5]">
    <input type="text" name="Tipps[Tipp_7][6]">

    1. Hallo!

      Ich habe das mit dem (int) casten probiert, es ändert aber am Output leider gar nichts.
      Das mit dem direkt ins Array einlesen ist interessant. Werde es mir genauer ansehen, aber für das Sortier-Problem sollte es keinen Unterschied machen oder?

      mfg Tobias

      1. »»aber für das Sortier-Problem sollte es keinen Unterschied machen oder?
        Nein nur das Einlesen wird vereinfacht (ich glaube nichtmal beschleunugt)

  3. Hallo!

    Ich habe es jetzt so gelöst, dass ich zuerst in einzelne (1dim) arrays einlese, diese sortiere und dann ins zwei-dim. schreibe.

    Das ist zwar mehr Schreibarbeit und nicht so schön aber wenigstens bekomm ich die richtige Sortierung hin. Falls mir das doch noch jemand mit dem 2dim näher bringen könnte wäre ich aber dankbar!

    danke, mfg, Tobias