Mehrdimensionales Array sortieren

4udesigns

Erfahrenes Mitglied
Hallo,

Ich habe ein Mehrdimensionales Array und folgendermaßen Werte darin gespeichert:
PHP:
   $felder[1]['inhalt']  = "Dies ist der Inhalt";
   $felder[1]['date']    = "13.02.1994";
   $felder[1]['views']   = "5";
   $felder[1]['sort_date']   = "16.02.1994";  // Am ältesten, Nr3
   $felder[2]['sort_date']   = "19.03.1994"; // Am neusten, Nr1
   $felder[3]['sort_date']   = "17.02.1994"; //Nr2

Jetzt möchte ich die Werte nach 'sort_date' sortieren bzw. sie so ausgeben, dass zuerst $felder[2] kommt, dann $felder[3] und dann felder[1].
Am besten wäre, wenn dann die Werte von $felder[2] in $felder[1] eingetragen werden und dann $felder[3] in $felder[2] usw.

Hauptsache ich kann die Werte mit Hilfe einer Schleife sortiert asugeben.

Wie kann ich das machen?
 
Zuletzt bearbeitet:
Das musst du unter Umständen selbst sortieren.
Welche PHP Version hast du? PHP >= 5.1.0 ?

Kannst mit phpinfo() rausfinden.
 
Ja, ich hab 5.0.4 ;)

Sicher? Ich dacht dafür gibt es einen Befehl..:(
Naja sonst muss ich die Funktion selbst machen, nur manuell ist das bei mir in diesem Fall nich möglich ;).
 
Dein Datumsformat ist nicht gerade gut sortierbar. Besser wäre ein Format wie 1994-02-16, das lexikographisch sortiert werden kann.
 
Hab gerade eine gemacht. In deinem Fall geht sogar strtotime(). Ich dachte erst es müsste strptime sein was erst ab 5.1.0 verfügbar ist.

Also hier ist sie:
PHP:
$max = count($felder);
for ($i = 1; $i <= $max; $i++)
{
  // aktueller Zeitstempel
  $stamp = strtotime($felder[$i]['sort_date']);
  // gleichzeitig neues Minimum
  $min = $i;
  // rechtsseitig das kleinste Element finden
  for ($j = ($i+1); $j <= $max; $j++)
  {
    if ($stamp > strtotime($felder[$j]['sort_date']))
    {
      $min = $j;
      $stamp = strtotime($felder[$j]['sort_date']);
    }
  }
  // tauschen
  $tmp = $felder[$min];
  $felder[$min] = $felder[$i];
  $felder[$i] = $tmp; 
}

Vorausetzung ist das du bei 1 beginnst zu Zählen im Index und dieser ohne Lücken ist (z.B. 1,2,3,4 und nicht 1, 2, 3, 7).

Das erzeugt:
Code:
array(3) {
  [1]=>
  array(4) {
    ["inhalt"]=>
    string(19) "Dies ist der Inhalt"
    ["date"]=>
    string(10) "13.02.1994"
    ["views"]=>
    string(1) "5"
    ["sort_date"]=>
    string(10) "16.02.1994"
  }
  [2]=>
  array(1) {
    ["sort_date"]=>
    string(10) "17.02.1994"
  }
  [3]=>
  array(1) {
    ["sort_date"]=>
    string(10) "19.03.1994"
  }
}

Was sortiert ist (nach sort_date).
 
Zuletzt bearbeitet:
Danke, das ist sehr Nett.
Aber ich wollte das Jetzt mit einer Schleife ausgeben:
PHP:
$i = 0;
while(count($felder)-1 > $i)
   {

   echo "
   $felder[$i]['inhalt'] 
   $felder[$i]['date']   
   $felder[$i]['views']   
   $felder[$i]['sort_date'] 

";
Jetzt wird erst $felder[1] und dann $felder[2] usw. asugegeben.
Und vor diese While-Schleife hab ich deinen code gesetzt, aber es funktioniert nicht. :(

Ich wei0 auch nich warum, aber es wird bei mir so ausgegeben, wie es am anfang auch war.

Wie genau muss ich es ausgeben?
 
PHP:
echo " 
   ".$felder[$i]['inhalt']."  
   ".$felder[$i]['date']."    
   ".$felder[$i]['views']."    
   ".$felder[$i]['sort_date']."  

";
// oder
echo " 
   {$felder[$i]['inhalt']}  
   {$felder[$i]['date']}    
   {$felder[$i]['views']}    
   {$felder[$i]['sort_date']}  

";
 
Ich würde da schon eine Sortierfunktion nehmen, dazu sind sie ja da :)
PHP:
<pre>
<?php
   $felder=array(1=>array(),2=>array(),3=>array());
   
   $felder[1]['inhalt']  = "Dies ist der Inhalt";
   $felder[1]['date']    = "13.02.1994";
   $felder[1]['views']   = "5";
   $felder[1]['sort_date']   = "16.02.1994";  // Am ältesten, Nr3
   $felder[2]['sort_date']   = "19.03.1994"; // Am neusten, Nr1
   $felder[3]['sort_date']   = "17.02.1994"; //Nr2  
   
   
   function cmpdate($a, $b)
    {
      return (strtotime($a['sort_date']) < strtotime($b['sort_date'])) ? 1 : -1;
    }

   usort($felder,'cmpdate');
   print_r($felder);
?>
(Beachte, dass dabei die Schlüssel neu vergeben werden)
 
Zuletzt bearbeitet:
Danke für deine Antwort. Muss ich bei deinem Code noch etwas ändern? $a z.B.?
und kann ich die $felder[1][.. dann wie vorher ausgeben?
 
An dem Sortieren musst du nichts ändern.

Die Schleife musst du sicher anpassen, denn wie erwähnt wurden die Schlüssel anhand der neuen Sortierung neu vergeben...der Array beginnt jetzt auch beim Index 0.

Die Ausgabe könnte bspw. so ablaufen:
PHP:
for($i=0;$i<count($felder);++$i)
   {
      echo '<hr />';
      foreach($felder[$i] as $key => $value)
      {
        echo '<strong>'.$key.':</strong>'.$value.'<br />';
      }
   }

Falls du die alten Arrayschlüssel aber behalten willst, geht das auch...per [phpf]uasort[/phpf]
PHP:
uasort($felder,'cmpdate');
   
   foreach($felder as $k => $v)
   {
      echo '<hr /><h3>Schl&uuml;ssel#'.$k.'</h3>';
      foreach($v as $kk => $vv)
      {
        echo '<strong>'.$kk.':</strong>'.$vv.'<br />';
      }
   }
(die Vergleichsfunktion cmpdate() bleibt dabei dieselbe wie vorher)
 
Zuletzt bearbeitet:
Zurück