*Markus: Assoziatives Array on the fly befüllen?

Hallo,

aus einer Datenbank lese ich Werte aus, zB zwei Werte pro Zeile. Ich will diese Werte pro Zeile in ein Array schreiben, um zum späteren Zeitpunkt auf die einzelnen Werte zugreifen zu können. Mit anderen Worten soll ein Array Arrays von Ausgabewerten enthalten. Hierzu habe ich folgendes versucht:

  
if (!($result = mysql_query("SELECT s_id, s_name FROM Supermarkt")) )   {  
   echo "Konnte Datenbankabfrage nicht ausführen\n";  
   mysql_close();  
  return false;  
}  
$i = 0;  
while ($row = mysql_fetch_assoc($result)) {  
   //Für jeden Satz ein Array von Werte dem Array hinzufügen  
   $datensatz = array();  
   $datensatz[0] = $row["s_id"];  
   $datensatz[1] = $row["s_name"];  
   $supermaerkte[$i] = $datensatz;  
   $i++;  
}  

...in einer anderen Datei mache ich dann folgendes:

  
<?php  
include "Connector.php";  
  
	$connector = new Connector();  
	$supermaerkte = array();  
	$supermaerkte = $connector->getSupermaerkte();  
	  
  
   for ($i = 0; $i < sizeof($supermaerkte); $i++)  {  
    	 for ($j = 0; $j < sizeof($supermaerkte[$i]); $j++)   {  
    	 	   echo "$supermaerkte[$i][0] $supermaerkte[$i][1]\n";  
    	 }  
   }  
?>  

Dummerweise sieht die Ausgabe so aus...
Array[0] Array[1]
Array[0] Array[1]
Array[0] Array[1]
Array[0] Array[1]
Array[0] Array[1]
Array[0] Array[1]
Array[0] Array[1]
Array[0] Array[1]
Array[0] Array[1]
Array[0] Array[1]

Ich bin leider mit den Möglichkeiten und der Syntax von PHP nicht so vertraut. Deswegen bitte ich um Hilfe, wie das oben genannte bewerkstelligt werden kann.

Danke,
Markus

  1. while ($row = mysql_fetch_assoc($result)) {
       //Für jeden Satz ein Array von Werte dem Array hinzufügen
       $datensatz = array();
       $datensatz[0] = $row["s_id"];
       $datensatz[1] = $row["s_name"];
       $supermaerkte[$i] = $datensatz;
       $i++;
    }
    [/code]

    Ich bin leider mit den Möglichkeiten und der Syntax von PHP nicht so vertraut. Deswegen bitte ich um Hilfe, wie das oben genannte bewerkstelligt werden kann.

    Vermeide unnötiges Herumschaufeln von daten - was spricht dagegen, das Datenbankobjekt direkt zu verwenden? Mit kleinen Ausnahmen lassen sich Datenbankobjekte in PHP so verwenden wie Arrays.

    Und wenns dennoch sein muss, $supermärkte[] = $row; sollte völlig ausreichen.

    1. for ($i = 0; $i < sizeof($supermaerkte); $i++)  {
           for ($j = 0; $j < sizeof($supermaerkte[$i]); $j++)   {
              echo "$supermaerkte[$i][0] $supermaerkte[$i][1]\n";
           }
         }

      hier wärst du ggf. mir foreach besser bedient.

    2. Hallo,

      Vermeide unnötiges Herumschaufeln von daten - was spricht dagegen, das Datenbankobjekt direkt zu verwenden? Mit kleinen Ausnahmen lassen sich Datenbankobjekte in PHP so verwenden wie Arrays.

      Da ich eine saubere Trennung von Persistenz und Logik haben will, die man natürlich mit diesem Overhead bezahlt. Dafür habe ich letztendlich keinen wilden Speghetticode, wie man es sehr gut von diversen PHP-Scripts kennt.

      Viele Grüße,
      Markus

      1. Die von mir verwendete verschachtelte for-Schleife war übrigens sowieso ein Blödsinn, da ich damit die Werte doppelt bekomme...

      2. Hi!

        Vermeide unnötiges Herumschaufeln von daten - was spricht dagegen, das Datenbankobjekt direkt zu verwenden? Mit kleinen Ausnahmen lassen sich Datenbankobjekte in PHP so verwenden wie Arrays.
        Da ich eine saubere Trennung von Persistenz und Logik haben will, die man natürlich mit diesem Overhead bezahlt. Dafür habe ich letztendlich keinen wilden Speghetticode, wie man es sehr gut von diversen PHP-Scripts kennt.

        Du musst aber auch nicht aufwendigen und wenig nachvollziehbaren Overhead einbauen.

        while ($row = mysql_fetch_assoc($result)) {
           //Für jeden Satz ein Array von Werte dem Array hinzufügen
           $datensatz = array();
           $datensatz[0] = $row["s_id"];
           $datensatz[1] = $row["s_name"];
           $supermaerkte[$i] = $datensatz;

        Du holst dir hier ein assoziatives Array, um daraus ein nummerisches zu machen. Das kannst du einerseits einfacher mit

        $supermaerkte[$i] = array($row["s_id"], $row["s_name"]);

        oder

        $supermaerkte[$i] = array_values(row);

        oder gleich mit mysql_fetch_row() haben. Andererseits leidet die Übersichtlichkeit darunter, wenn du nur noch 0 und 1 statt sprechender Namen hast. (Wenn dir die Feldnamen des DBMS im weiteren Verlauf nicht zusagen, kannst du sie immer noch per Alias in der Abfrage umbenennen.)

        Lo!

  2. Hi,

    echo "$supermaerkte[$i][0] $supermaerkte[$i][1]\n";

    Dummerweise sieht die Ausgabe so aus...
    Array[0] Array[1]
    Array[0] Array[1]

    Und da fällt dir kein Zusammenhang auf?
    Die [0] und die [1], die du jeweils hinter $supermaerkte[$i] geschrieben hast, stehen immer noch da - d.h., sie wurden gar nicht als Bestandteil der Variablennotation erkannt. (Und da $supermaerkte[$i] seinerseits ein Array ist, ergibt auch seine Umwandlung in ein Textliteral zwecks Ausgabe nur "Array" - wie es in PHP üblich ist.)

    Wie man Variablen korrekt in Strings einbaut (wenn es denn überhaupt notwendig ist*), erfährst du hier: http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing

    * Ist es hier natürlich nicht - Verketten der Inhalte der beiden Arrayelemente mit einem trennenden Leerzeichen und einem abschliessenden \n würde völlig ausreichen.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Hallo,

      Und da fällt dir kein Zusammenhang auf?
      Die [0] und die [1], die du jeweils hinter $supermaerkte[$i] geschrieben hast, stehen immer noch da - d.h., sie wurden gar nicht als Bestandteil der Variablennotation erkannt. (Und da $supermaerkte[$i] seinerseits ein Array ist, ergibt auch seine Umwandlung in ein Textliteral zwecks Ausgabe nur "Array" - wie es in PHP üblich ist.)

      Es ist nicht so einfach die Ausgabe zu interpretieren, wenn man die Eigenheiten von PHP nicht kennt, schon deswegen weil der String "Array" in der Ausgabe vorkommt, wo auch immer der herkommt.

      Wie man Variablen korrekt in Strings einbaut (wenn es denn überhaupt notwendig ist*), erfährst du hier: http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing

      Du hast recht, blöder Fehler. So funktioniert's.

      * Ist es hier natürlich nicht - Verketten der Inhalte der beiden Arrayelemente mit einem trennenden Leerzeichen und einem abschliessenden \n würde völlig ausreichen.

      Ich brauche die Elemente einzeln. Sonst hätte ich es natürlich auch so gemacht.

      Viele Grüße,
      Markus

      1. Hi,

        * Ist es hier natürlich nicht - Verketten der Inhalte der beiden Arrayelemente mit einem trennenden Leerzeichen und einem abschliessenden \n würde völlig ausreichen.

        Ich brauche die Elemente einzeln. Sonst hätte ich es natürlich auch so gemacht.

        Das war immer noch auf die Ausgabe bezogen.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. Hi,

          Das war immer noch auf die Ausgabe bezogen.

          Ok. Die Ausgabe war hier ohnehin nur provisorisch.

          Markus

          1. Hi,

            Das war immer noch auf die Ausgabe bezogen.

            Ok. Die Ausgabe war hier ohnehin nur provisorisch.

            Da hier aber genau diese dein Problem verursachte, solltest du vielleicht auf solche "Provisorien" verzichten, und es gleich korrekt macht.

            MfG ChrisB

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