Andreas Berkl: mehrdimensionales Array sortieren

Hallo,

ich fürchte, das ist eine echte Anfängerfrage, bin hier im Forum allerdings nicht fündig geworden.

Ich möchte ein Array nach 'Nachname', 'Vorname' sortieren:

<?PHP
$entry["lastname"][0] = "Müller";
$entry["firstname"][0] = "Günther";
$entry["lastname"][1] = "Bauer";
$entry["firstname"][1] = "Michael";
$entry["lastname"][2] = "Zeiler";
$entry["firstname"][2] = "Alfons";
$entry["lastname"][3] = "Müller";
$entry["firstname"][3] = "Reinhard";
$entry["lastname"][4] = "Müller";
$entry["firstname"][4] = "Markus";
$entry["lastname"][5] = "de Klerk";
$entry["firstname"][5] = "Simon";
$entry["lastname"][6] = "Müller";
$entry["firstname"][6] = "Franz";

'natcasesort' sortiert 'de Klerk' richtig!

erstmal die Vornamen...

natcasesort ($entry["firstname"]);

Pointer auf Anfang setzen...

reset($entry);

jetzt nach die Nachnamen...

natcasesort ($entry["lastname"]);

while (list($key) = each($entry["lastname"]))
{
  echo  $key  . " > ";
  echo  $entry ["lastname"] [$key] . ", ";
  echo  $entry ["firstname"] [$key] . "<BR>";
}
?>

Als Ergebnis bekomme ich:

1 > Bauer, Michael
5 > de Klerk, Simon
3 > Müller, Reinhard
4 > Müller, Markus
6 > Müller, Franz
0 > Müller, Günther
2 > Zeiler, Alfons

und nicht, wie erhofft:

1 > Bauer, Michael
5 > de Klerk, Simon
5 > Müller, Franz
0 > Müller, Günther
4 > Müller, Markus
3 > Müller, Reinhard
2 > Zeiler, Alfons

Kann mir da jemand einen Tipp geben?

Danke, Andreas

  1. Hi,

    schau mal ob das hilft:
    http://develnet.org/tech/dclp/arrays.html#arrays-4

    Grüße
    Heike

  2. Aloha!

    Ich möchte ein Array nach 'Nachname', 'Vorname' sortieren:

    $entry["lastname"][0] = "Müller";
    $entry["firstname"][0] = "Günther";

    natcasesort ($entry["firstname"]);
    natcasesort ($entry["lastname"]);

    while (list($key) = each($entry["lastname"]))

    Kann mir da jemand einen Tipp geben?

    Du hast einen groben Denkfehler drin.

    Du legst im Prinzip zwei vollkommen voneinander unabhängige Arrays an:
    $entry['firstname'] und $entry['lastname'].

    Genausogut kannst du sie auch $firstname und $lastname nennen.

    Dann sortierst du diese beiden Arrays intern mit natcasesort().

    Und dann gibst du das nach Nachnamen sortierte Array aus. Dieses Array hat aber absolut noch niemals davon gehört, dass es beim Sortieren auch Vornamen zu beachten hat, die im anderen Array drinstecken.

    Lösung: Du musst dir deine eigene Sortier-Routine schreiben.

    Dabei wirst du auch auf folgendes Problem stoßen: Deine Daten sind derzeit falsch herum in den Arrays. Du solltest mit $entry[indexnummer]['feldbezeichnung'] auf die Einträge zugreifen, nicht umgekehrt mit $entry['feldbezeichnung'][indexnummer]. Denn beim Sortieren willst du ja, dass alle Namensbestandteile des ersten, zweiten, dritten... Datensatzes zusammen bleiben. Das ist bei deiner Sortierung aber nur mit Glück der Fall.

    Schau dir einfach die Funktion uasort() genauer an. Diese musst du verwenden, um das Array zu sortieren. Dabei musst du eine eigene Sortierfunktion schreiben, die entsprechend prüft, welche Namenskombination aus Vorname und Nachname denn nun nach vorne gehört, und welche nach hinten.

    Funktionsvorschlag:

    function namesort ($a, $b)
    {
      $result = strnatcasecom($a['lastname'],$b['lastname');
      if ($result == 0) // Gleiche Nachnamen
      {
        $result = strnatcasecmp($a['firstname'],$b['firstname']);
      } //Dann nach Vornamen sortieren
      return $result;
    }

    uasort($entry,"namesort");

    - Sven Rautenberg

    1. Hallo Sven,

      Du hast einen groben Denkfehler drin.

      Hatte ich befürchtet, Vielen Dank!

      Lösung: Du musst dir deine eigene Sortier-Routine schreiben.

      Na gut, auch das hatte ich schon siehe oben!