wuscheck: Bester Lösungsweg?

Hallo,
ich habe ein 1D-Array mit IDs. Die IDs gehören zu Personen, die in einer MySQL-DB hinterlegt sind. Nun möchte ich die Namen und zugehörigen Adressdaten der Personen nach Nachname sortiert ausgeben.

Ich habe schon den ganzen Abend im Netz gestöbert. Mittlerweile scheint die Lösung zu sein, die Daten in ein mehrdimensionales Array zu schreiben und über multisort zu sortieren und auszugeben.

Jetzt mal eine peinliche Frage wie bekomme ich aus den einzelnen arrays ein mehrdimensionales...

SELECT vorname, nachname, telefon, strasse FROM ...
while ($row = mysql_fetch_array ($result)) {
$vorname = $row ["vorname"];
$nachname = $row ["nachname"];
$telefon = $row ["telefon"];
$strasse = $row ["strasse"];
}

Oder gibt es einen anderen eleganten Weg?

Danke schon mal im Voraus...

wuscheck

  1. Hallo,

    vorweg: Ich bin kein ausgewiesener Experte in diesen Dingen, aber hier dennoch ein paar Anregungen meinerseits.

    ich habe ein 1D-Array mit IDs.

    Wo kommt das (dessen Daten) her?

    Die IDs gehören zu Personen, die in einer MySQL-DB hinterlegt sind. Nun möchte ich die Namen und zugehörigen Adressdaten der Personen nach Nachname sortiert ausgeben.

    Ich habe schon den ganzen Abend im Netz gestöbert. Mittlerweile scheint die Lösung zu sein, die Daten in ein mehrdimensionales Array zu schreiben und über multisort zu sortieren und auszugeben.

    Warum willst du das mit PHP machen, wenn dir MySQL die Arbeit schon bei der Abfrage abnehmen kann? Stichwort: ORDER BY [ASC|DESC]

    Jetzt mal eine peinliche Frage wie bekomme ich aus den einzelnen arrays ein mehrdimensionales...

    SELECT vorname, nachname, telefon, strasse FROM ...
    while ($row = mysql_fetch_array ($result)) {
    $vorname = $row ["vorname"];
    $nachname = $row ["nachname"];
    $telefon = $row ["telefon"];
    $strasse = $row ["strasse"];
    }

      
    // Pseudo-Code  
    SELECT id, vorname, nachname, telefon, strasse FROM tab ORDER BY nachname ASC  
    while ($row = mysql_fetch_array ($result)) {  
    $personen[$id]['vorname'] = $row ["vorname"];  
    ...  
    }  
    
    

    wobei du idealerweise eigentlich in der DB Tabelle ein entsprechendes ID-Feld (als auto_increment Feld) haben solltest.

    In deinem Beispiel haben die Variablen $vorname, $nachname, etc. am Ende der Schleife immer nur die Werte des letzten Eintrags, da sie ja bei jedem Durchgang jeweils überschrieben werden!

    Ansonsten kannst du bspw. auch vorher ein neues leeres Array (z.B. $personen) anlegen, und nach jedem Schleifendurchgang die jeweiligen Werte deiner Variablen in dieses Array einfügen.

      
    $personen = array();  
    ...  
    while ($row = mysql_fetch_array ($result)) {  
    $vorname = $row ["vorname"];  
    ...  
    $personen[] = array("vorname" => $vorname, "nachname" => $nachname, ...);  
    }  
    
    

    Nur müsstest du sinnvollerweise besser deine IDs gleich passend zuordnen, bzw. die von mir o.g. Variante (IDs in der DB Tabelle) verwenden.

    Oder gibt es einen anderen eleganten Weg?

    Wahrscheinlich. ;-)
    Den werden wir beide erfahren, wenn sich hier einer der Experten zu Wort meldet.

    Gruß Gunther

    1. Moin!

      Jetzt mal eine peinliche Frage wie bekomme ich aus den einzelnen arrays ein mehrdimensionales...

      SELECT vorname, nachname, telefon, strasse FROM ...
      while ($row = mysql_fetch_array ($result)) {
      $vorname = $row ["vorname"];
      $nachname = $row ["nachname"];
      $telefon = $row ["telefon"];
      $strasse = $row ["strasse"];
      }

      // Pseudo-Code
      SELECT id, vorname, nachname, telefon, strasse FROM tab ORDER BY nachname ASC
      while ($row = mysql_fetch_array ($result)) {
      $personen[$id]['vorname'] = $row ["vorname"];
      ...
      }

        
      Du kopierst hier viel zuviel rum.  
        
      
      > Ansonsten kannst du bspw. auch vorher ein neues leeres Array (z.B. $personen) anlegen, und nach jedem Schleifendurchgang die jeweiligen Werte deiner Variablen in dieses Array einfügen.  
      > ~~~php
        
      
      > $personen = array();  
      > ...  
      > while ($row = mysql_fetch_array ($result)) {  
      > $vorname = $row ["vorname"];  
      > ...  
      > $personen[] = array("vorname" => $vorname, "nachname" => $nachname, ...);  
      > }  
      > 
      
      

      Hier kopierst du noch viel mehr zuviel rum.

      Das Resultat von mysql_fetch_array() ist ein Array, dessen Keys die Spaltennamen sind, und dessen Values jeweils einen einzelnen Datensatz enthalten. Dieses Array kann man direkt einem Sammelarray reinreichen, ohne die Felder einzel hin- und herkopieren zu müssen:

        
      $personen = array();  
      ...  
      while ($row = mysql_fetch_array ($result)) {  
      $personen[] = $row;  
      
      

      Fertig.

      Also im Schnelldurchlauf:

      $ids = array(1,2,3,4,5); //Demoliste - irgendwelche IDs, die irgendwoher kommen.
      ...
      array_walk($ids, "intval"); //IDs unbedingt mit intval() in einen Integer wandeln, sonst böse!
      $idliste = implode($ids, ","); // Kommaseparierten String erzeugen.

      $sql = "SELECT vorname, nachname FROM tabelle WHERE id IN (".$idliste.") ORDER BY nachname ASC";
      ...query...
      ...fetchen in Schleife, s.o. ...

      - Sven Rautenberg

      1. Hi,

        array_walk($ids, "intval"); //IDs unbedingt mit intval() in einen Integer wandeln, sonst böse!
        $idliste = implode($ids, ","); // Kommaseparierten String erzeugen.

        $sql = "SELECT vorname, nachname FROM tabelle WHERE id IN (".$idliste.") ORDER BY nachname ASC";

        Auf ein leeres Array sollte man noch prüfen - denn "WHERE id IN ()" würde einen Fehler in der Query bedeuten.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
      2. Moin Sven!

        Du kopierst hier viel zuviel rum.
        Hier kopierst du noch viel mehr zuviel rum.

        Das Resultat von mysql_fetch_array() ist ein Array, dessen Keys die Spaltennamen sind, und dessen Values jeweils einen einzelnen Datensatz enthalten. Dieses Array kann man direkt einem Sammelarray reinreichen, ohne die Felder einzel hin- und herkopieren zu müssen:

        $personen = array();
        ...
        while ($row = mysql_fetch_array ($result)) {
        $personen[] = $row;

        
        >   
        > Fertig.  
        
        Ich schrieb ja bereits, dass die hiesigen Experten mit Sicherheit eine elegantere Methode parat haben - quod erat demonstrandum!  
          
        Einziger Nachteil den ich sehe, ist die Verdoppelung der Array-Größe durch mysql\_fetch\_array, was sich bei größeren Datenmengen nachteilig auf den Speicherverbrauch auswirkt.  
          
        Aber ansonsten wieder etwas gelernt - danke.  
        (Wobei ich zu meiner Entschuldigung aber sagen muss, dass ich die anderen Varianten so schon oft in diversen Scripts gesehen habe, denn irgendwoher muss ich den schlechten Stil ja haben ;-)!)  
          
        Gruß Gunther
        
        1. Hallo Gunther,

          Einziger Nachteil den ich sehe, ist die Verdoppelung der Array-Größe durch mysql_fetch_array, was sich bei größeren Datenmengen nachteilig auf den Speicherverbrauch auswirkt.

          Dann setz als zweiten Parameter MYSQL_ASSOC ein oder verwende gleich mysql_fetch_assoc().

          Gruß,
          Tobias

        2. Moin!

          Einziger Nachteil den ich sehe, ist die Verdoppelung der Array-Größe durch mysql_fetch_array, was sich bei größeren Datenmengen nachteilig auf den Speicherverbrauch auswirkt.

          Ich würde ja mal wetten, dass PHP auch an dieser Stelle die Taktik "Referenz statt Kopieren" anwendet, so dass effektiv nur die Indices überflüssig wären, die reinen Daten aber solange, wie sie sich nicht verändern, lediglich einmal im Speicher landen und die Duplikate referenziert werden.

          Das ist nur dann eine Datenverdopplung, wenn die Nutzdatenmenge klein ist im Verhältnis zur Verwaltungsdatenmenge des Arrays.

          Aber wie tk erwähnte: mysql_fetch_assoc() hilft, die numerischen Indices werden in der Regel nicht benötigt.

          - Sven Rautenberg

  2. hi,

    ich habe ein 1D-Array mit IDs. Die IDs gehören zu Personen, die in einer MySQL-DB hinterlegt sind. Nun möchte ich die Namen und zugehörigen Adressdaten der Personen nach Nachname sortiert ausgeben.

    Da wirst Du gar nichts mit PHP machen, sondern mit MySQL (ORDER BY). Und falls die Nachnamen noch keine dedizierte Spalte haben, wirds langsam Zeit für.

    Hotte