Stefan: Werte in while-Schleife in Array speichern und Schlüssel geben

Hallo zusammen!

Ich habe eine (hoffentlich) kurze Frage:

Und zwar lasse ich mir gerade aus einer Datenbank eine Tabelle abrufen. Diese beinhaltet mehrere Spalten. Die Werte weise ich in einer while-Schleife Variablen / Arrays zu.

Ich hätte am Ende gern ein großes Array, das für jeden Datensatz eine Variable enthält, der alle anderen Variablen als Schlüssel zugeordnet sind.

Ich bekomme es aber nicht hin, da das Array am Ende der while-Schleife ständig wieder überschrieben wird oder den Variablen keine Schlüssel zugeordnet werden können.

Kann mir da bitte jemand mal auf die Sprünge helfen (ich kann zwar alles in ein Array schreiben, aber dann ist es weder sortiert noch übersichtlich)...

while($row_pos = mysql_fetch_object($result_pos))  
               {  
                $ID="$row_pos->ID";  
                $name="$row_pos->name";  
                $vorname="$row_pos->vorname";  
                $array[] = $ID;

Ich hätte gerne die Möglichkeit, als "Hauptvariablen" im Array die $ID der Einträge zu haben und diesen als Schlüssel sowohl $name als auch $vorname zuzuweisen.

Bin für jede Hilfe dankbar und hoffe, man kann verstehen, was ich will... ;-)

Gruß,
Stefan

  1. Am Ende der while-Schleife fehlt natürlich noch }.

  2. Tach!

    Und zwar lasse ich mir gerade aus einer Datenbank eine Tabelle abrufen. Diese beinhaltet mehrere Spalten. Die Werte weise ich in einer while-Schleife Variablen / Arrays zu.

    Das ist unnötig, weil mysql_fetch_assoc() dies bereits macht.

    Ich hätte am Ende gern ein großes Array, das für jeden Datensatz eine Variable enthält, der alle anderen Variablen als Schlüssel zugeordnet sind.

    Dieses von mysql_fetch_assoc() zurückgegebenen Array kannst du dann einem Sammel-Array hinzufügen.

    Und mit mysqli nebst mysqlnd (PHP 5.3 vorausgesetzt) könntest du das alles mit einem einzelnen mysqli_fetch_all() erledigen.

    Die alte mysql-Extension ist auch nicht mehr empfehlenswert, weil sie ab PHP 5.5 deprecated ist. Alternativen sind mysqli oder PDO.

    dedlfix.

    1. Werte Helfer, ich bin euch sehr dankbar! Das war genau das, was ich gesucht habe!

      Schönen Abend noch und viele Grüße,

      Stefan

  3. Hi,

    Ich hätte am Ende gern ein großes Array, das für jeden Datensatz eine Variable enthält, der alle anderen Variablen als Schlüssel zugeordnet sind.

    while($row_pos = mysql_fetch_object($result_pos))

    {
                    $ID="$row_pos->ID";
                    $name="$row_pos->name";
                    $vorname="$row_pos->vorname";
                    $array[] = $ID;

      
    mal so nebenbei: du kannst die Anführungsstrichelchen weglassen.  
      
    
    > Ich hätte gerne die Möglichkeit, als "Hauptvariablen" im Array die $ID der Einträge zu haben und diesen als Schlüssel sowohl $name als auch $vorname zuzuweisen.  
      
    Ich weiß nicht, was die Hauptvariable sein soll, aber ich glaube, du meinst den Schlüssel; im nächsten Hauptsatz sollte es dann Wert anstatt Schlüssel heißen.  
      
    Ein Array (in PHP) ist eine Datenstruktur, welches Schlüsseln Werte zuweist. Die Schlüssel können sowohl numerisch sein (so wie du es oben machst, da $array[] immer am numerischen Ende anfügt) oder ein anderer Datentyp.  
      
    Folgendes könntest du tun:  
    ~~~php
    while (/* ... */) {  
      $array[$row_pos->ID] = $row_pos;  
    }
    

    Dann kannst du auf ein Element zugreifen mit $array[$eineId]->name.

    Alternativ:

    while (/* ... */) {  
      $array[$row_pos->ID] = array($row_pos->name, $row_pos->vorname);  
    }  
      
    $array[$eineId][0]; // Name der Person mit ID $eineId  
    
    

    Bis die Tage,
    Matti

    1. Alternativ:

      while (/* ... */) {

      $array[$row_pos->ID] = array($row_pos->name, $row_pos->vorname);
      }

      $array[$eineId][0]; // Name der Person mit ID $eineId

        
        
      Hallo Matti (oder auch jeder andere), eine Frage hätte ich doch noch:  
        
      In der Tabelle ist eine Spalte "position" vorhanden. Wenn nun mehrere Leute die gleiche Position besetzen, bekomme ich immer die letzte Person angezeigt. Wie kann ich auf alle Leute zugreifen, die diese Position besetzen?  
        
      Das Ziel meins Scripts ist nämlich, herauszufinden, wer welche Position besetzt, und alle Leute zu nennen, die diese besetzen (in einer <ul>)... Also quasi ist alles außer der Position unbekannt und soll dann erst angezeigt weredn.  
        
      Nochmals vielen Dank bereits im Voraus für deine Hilfe!  
        
      Gruß,  
      Stefan
      
      1. Kann mir hier niemand mehr weiterhelfen? :-(

      2. Tach!

        In der Tabelle ist eine Spalte "position" vorhanden. Wenn nun mehrere Leute die gleiche Position besetzen, bekomme ich immer die letzte Person angezeigt. Wie kann ich auf alle Leute zugreifen, die diese Position besetzen?

        Beschreibe bitte die Dinge (auch) aus der Sicht des Programms! Wieso wird immer nur die letzte Person angezeigt? Überschreibst du deine Daten, so dass immer nur der letzte Datensatz übrigbleibt, oder passiert irgendwas ganz anderes?

        Das Ziel meins Scripts ist nämlich, herauszufinden, wer welche Position besetzt, und alle Leute zu nennen, die diese besetzen (in einer <ul>)... Also quasi ist alles außer der Position unbekannt und soll dann erst angezeigt weredn.

        Dann musst du vermutlich deine Daten so organisieren, dass zuerst nach Position gruppiert wird und darin die Leute aufgelistet sind. Kann man durch eine weitere Verschachtlungsebene hinbekommen. Genaueres kann ich aber erst dann vorschlagen, wenn du mehr als nur die obige Andeutung schreibst.

        dedlfix.

        1. Hallo dedlfix,

          Beschreibe bitte die Dinge (auch) aus der Sicht des Programms! Wieso wird immer nur die letzte Person angezeigt? Überschreibst du deine Daten, so dass immer nur der letzte Datensatz übrigbleibt, oder passiert irgendwas ganz anderes?

          Wenn ich das wüsste, hätte ich das Problem wahrscheinlich nicht... Ich denke, dass die Daten überschrieben werden, da die Werte in der Spalte "position" mehrfach vorkommen.

          Dann musst du vermutlich deine Daten so organisieren, dass zuerst nach Position gruppiert wird und darin die Leute aufgelistet sind. Kann man durch eine weitere Verschachtlungsebene hinbekommen.

          Wie bekomme ich denn eben jene weitere Verschachtelungsebene hin?

          Ich mache es aktuell so:

          while ($row_pos=mysql_fetch_object($result_pos))  
            {  
             $array[$row_pos->position]=array($row_pos->ID, $row_pos->nachname, $row_pos->vorname);  
            }  
          echo $array["position1"][0]; // ID der Person mit der Position "position1"
          

          Hier wird nur die letzte Person einer Position angezeigt. Ich hoffe, das hilft dir weiter (mehr als diese while-Schleife passiert aktuell nicht mehr).

          Die Daten werden folgendermaßen aus der Tabelle ausgelesen:

          "SELECT * FROM auslistung WHERE team='1' ORDER BY pos_nr ASC"

          Zur Erklärung: Jeder Position ist eine Nummer zugeordnet (von 1 bis 7).

          1. Tach!

            Beschreibe bitte die Dinge (auch) aus der Sicht des Programms! Wieso wird immer nur die letzte Person angezeigt? Überschreibst du deine Daten, so dass immer nur der letzte Datensatz übrigbleibt, oder passiert irgendwas ganz anderes?
            Wenn ich das wüsste, hätte ich das Problem wahrscheinlich nicht... Ich denke, dass die Daten überschrieben werden, da die Werte in der Spalte "position" mehrfach vorkommen.

            Wenn du nicht weißt, was dein selbst geschriebenes Programm macht, dann solltest du es beim Ausführen beobachten. Dazu haben sich Kontrollausgaben zum Beispiel von Variableninhalten bewährt.

            Ich mache es aktuell so:

            while ($row_pos=mysql_fetch_object($result_pos))

            {
               $array[$row_pos->position]=array($row_pos->ID, $row_pos->nachname, $row_pos->vorname);
              }
            echo $array["position1"][0]; // ID der Person mit der Position "position1"

              
            Du machst das immer noch unnötig umständlich. Du hast dich zwar für meine erste Antwort bedankt, sie aber nicht gelesen oder nicht verstanden. Schade. Wie auch immer, wenn in $row\_pos->position 42 steht, wird unter diesem Schlüssel das aktuelle Personenarray abgelegt. Wenn beim nächsten Durchlauf wieder eine Person mit 42 kommt, was passiert dann? Sie wird wieder diesem Schlüssel zugewiesen und der alte Wert geht verloren. Du brauchst an der Stelle also eine Möglichkeit, mehrere Werte unter der 42 ablegen zu können.  
              
            
            > > Dann musst du vermutlich deine Daten so organisieren, dass zuerst nach Position gruppiert wird und darin die Leute aufgelistet sind. Kann man durch eine weitere Verschachtlungsebene hinbekommen.  
            > Wie bekomme ich denn eben jene weitere Verschachtelungsebene hin?  
              
            $array['42'] sollte nicht nur ein Einpersonen-Array enthalten sondern zunächst ein Array und in dem sollten die Personendatensätze/-arrays zu liegen kommen.  
              
            print\_r($array) sollte am Ende sowas ergeben:  
              
            Array (  
                [42] => Array (  
                        [0] => Array ( personendaten )  
                        [1] => Array ( weitere person )  
                    )  
            )  
              
            Derzeit sieht es so aus (und lass dir das mit print\_r() bestätigen):  
              
            Array (  
                [42] => Array ( weitere person )  
            )  
              
              
            dedlfix.