Michael: 3 strings in eine 3 Dimensionales Array schreiben

Hallo

ich habe ein Problem ich habe 3 Strings die aus der Datenbank kommen ich habe die in meinem Test Script schon die jeweiligen Strings gepackt.

Nun sollen die 3 Strings (#### script 2) in ein 3 Dimensionales Array geschrieben werden aber das klappt bei mehrmaligen Umbau auch nicht?
:-(

Vielleicht findet jemand von euch den Fehler oder kann mir sagen was ich falsch machen?

Gruß Michael

<?php

script 1

$user_liste = "101;102;105;110";

$u_liste = explode(';', $user_liste);
$liste_array=array();

foreach ($u_liste as $nr)
  {
  $liste_array[]=$nr;
  }
echo "$listenr_array:<br>";
print_r($liste_array);
echo "<br>";  //Ausgabe korrekt

####### script 2

$gesamt_liste1   = "101;102;103;104;105;106;107;108;109;110";
$gesamt_liste2   = "11 ;11 ;12 ;12 ;12 ;13 ;13 ;14 ;14 ;15";
$gesamt_liste3   = "1  ;1  ;1  ;1  ;1  ;2  ;2  ;2  ;2  ;2";

$listen1 = explode(';', gesamt_liste1);
$listen2 = explode(';', gesamt_liste2);
$listen3 = explode(';', gesamt_liste3);

$array_kompakt[][][]=array();

foreach ($listen1 as $n1)
  {
  $array_kompakt[]=$n1;

foreach ($listen2 as $n2)
   {
   $array_kompakt[][]=$n2;

foreach ($listen3 as $n3)
    {
    $array_kompakt[][][]=$n3;
    }
  }
 echo "$array_kompakt:<br>";
 print_r($array_kompakt);
 echo "<br>";

?>

  1. Hallo

    hallo

    $gesamt_liste1   = "101;102;103;104;105;106;107;108;109;110";
    $gesamt_liste2   = "11 ;11 ;12 ;12 ;12 ;13 ;13 ;14 ;14 ;15";
    $gesamt_liste3   = "1  ;1  ;1  ;1  ;1  ;2  ;2  ;2  ;2  ;2";

    $listen1 = explode(';', gesamt_liste1);
    $listen2 = explode(';', gesamt_liste2);
    $listen3 = explode(';', gesamt_liste3);

    wenn es kein schreibfehler ist, sehe ich hier schon drei fehler: bei gesamtliste1 - 3 fehlt das dollar-zeichen.

    gruß,
     lindic

    1. Ok davon abgesehen das $ und eine Klammer fehlten schreibt er mir das Array falsch auf?

      Das Array soll nachher so aussehen:

      101 11 1
      102 11 1
      103 12 1
      104 12 1
      105 12 1
      106 13 2
      107 13 2
      108 14 2
      109 14 2
      110 15 2

      Mein neuer Code:

      $gesamt_liste1   = "101;102;103;104;105;106;107;108;109;110";
      $gesamt_liste2   = "11 ;11 ;12 ;12 ;12 ;13 ;13 ;14 ;14 ;15";
      $gesamt_liste3   = "1  ;1  ;1  ;1  ;1  ;2  ;2  ;2  ;2  ;2";

      $listen1 = explode(';', $gesamt_liste1);
      $listen2 = explode(';', $gesamt_liste2);
      $listen3 = explode(';', $gesamt_liste3);

      $array_kompakt[][][]=array();

      foreach ($listen1 as $n1)
        {
        $array_kompakt[]=$n1;

      foreach ($listen2 as $n2)
         {
         $array_kompakt[][]=$n2;

      foreach ($listen3 as $n3)
          {
          $array_kompakt[][][]=$n3;
          }
         }
        }
       echo "$array_kompakt:<br><pre>";
       print_r($array_kompakt);
       echo "</pre><br>";

      1. Hallo Micha,

        Ok davon abgesehen das $ und eine Klammer fehlten schreibt er mir das Array falsch auf?

        Tipp falls noch nicht bekannt: error_reporting(E_ALL) hilft auf der Entwicklungsumgebung. PHP schmeisst dann wegen jeder Kleinigkeit zumindest eine Notice, solche Fehler können dann nicht mehr passieren.

        Das Array soll nachher so aussehen:

        101 11 1
        102 11 1
        103 12 1
        104 12 1
        105 12 1
        106 13 2
        107 13 2
        108 14 2
        109 14 2
        110 15 2

        Ok ist klar, aber dafür brauchst Du keine 3 Dimensionen, es reichen da auch 2 Dimensionen. So, im Prinzip musst Du Deine bestehende Datensätze lediglich umsortieren. Ich habe Dein Script mal umgeschrieben und es funktioniert auch mit Schleifen, allerdings kann es gut möglich sein das es in PHP dafür eine performantere und elegantere Methode gibt, evt. sowas wie array_fill()?

        Ich weiss das es im Forum nicht gerne gesehen ist wenn man fertigen Code als Lösung schickt (ich finde es meist auch nicht so toll da die vermeintlichen Lösungen oft auch fehlerbehaftet sind), deshalb werde ich Dir mit ein paar Anmerkungen zu meiner Lösung versuchen zu helfen:

        1. Zwei Dimensionen reichen aus:

        Array danach:

        [0] => Array
                  (
                  [0] => 101
                  [1] => 11
                  [2] => 1
                  )
           ..........
           [9] => Array
                  (
                  [0] => 110
                  [1] => 15
                  [2] => 2
                  )

        2. Explode Deine Listen doch ebenfalls in ein Array, dann ist Dein Script flexibler was die Anzahl der Werte angeht die Du pro Datensatz schreiben willst.

        3. Ich hab zwei verschachtelte for-Schleifen anstatt foreach genommen, meiner Meinung nach in dem Fall besser da Du die Zählvariablen zum Ansteuern Deiner Indizes der Arrays nehmen kannst. Dies macht das ganze IMHO flexibler.

        4. Mir hilft es wenn ich die gewünschte Struktur des Arrays aufschreibe, dann ist das ganze nicht mehr so abstrakt.

        Wie gesagt, es handelt sich IMHO lediglich um eine Umverteilung oder Neuanordnung der bestehenden Werte, möglicherweise gibt es da eine raffiniertere Lösung mit bestehenden PHP-Funktionen.

        Viel Spass beim testen,
        Grüsse AndreD

          1. Zwei Dimensionen reichen aus:

          Array danach:

          [0] => Array
                    (
                    [0] => 101
                    [1] => 11
                    [2] => 1
                    )
             ..........
             [9] => Array
                    (
                    [0] => 110
                    [1] => 15
                    [2] => 2
                    )

          1. Explode Deine Listen doch ebenfalls in ein Array, dann ist Dein Script flexibler was die Anzahl der Werte angeht die Du pro Datensatz schreiben willst.

          2. Ich hab zwei verschachtelte for-Schleifen anstatt foreach genommen, meiner Meinung nach in dem Fall besser da Du die Zählvariablen zum Ansteuern Deiner Indizes der Arrays nehmen kannst. Dies macht das ganze IMHO flexibler.

          3. Mir hilft es wenn ich die gewünschte Struktur des Arrays aufschreibe, dann ist das ganze nicht mehr so abstrakt.

          Wie gesagt, es handelt sich IMHO lediglich um eine Umverteilung oder Neuanordnung der bestehenden Werte, möglicherweise gibt es da eine raffiniertere Lösung mit bestehenden PHP-Funktionen.

          Viel Spass beim testen,

          Hallo AndreD

          ich habe nun etwas rumgespielt das mit dem abstrakten ist die eine Sache ich schreibe es mir ebenfalls auf einem Zettel auf aber wenn man nicht genau weiß wie es in der Praxis das letzendlich funktioniert das ist das ist eine andere Sache... Ok da hilft nur probieren und verstehen.

          Das mit error_reporting(E_ALL) kannte ich noch nicht darum werde ich mich nach mein Problem kümmern.

          array_fill kann ich für mein Problem nicht gebrauchen? http://www.php-mysql-programmierung.de/function.array-fill.html Oder wenn doch weiß ich nicht was ich damit soll?

          Ok so sieht meine Lösung aus die noch nicht richtig funktioniert...

          $gesamt_liste1   = "101;102;103;104;105;106;107;108;109;110";
          $gesamt_liste2   = "11 ;11 ;12 ;12 ;12 ;13 ;13 ;14 ;14 ;15";
          $gesamt_liste3   = "1  ;1  ;1  ;1  ;1  ;2  ;2  ;2  ;2  ;2";

          $listen1 = explode(';', $gesamt_liste1);
          $listen2 = explode(';', $gesamt_liste2);
          $listen3 = explode(';', $gesamt_liste3);

          $array_kompakt=array();

          $y = 0;
          for ($i=0; $i <=10; $i++)
          {
           foreach ($listen1 as $n1)
            {
            $array_kompakt[$i][0]=$n1;
            }

          foreach ($listen2 as $n2)
            {
            $array_kompakt[$i][1]=$n2;
            }

          foreach ($listen3 as $n3)
            {
            $array_kompakt[$i][2]=$n3;
            }
           $y++;
          }

          echo "$array_kompakt:<br><pre>";
           print_r($array_kompakt);
           echo "</pre><br>";

          PHP gibt mir folgende Ausgabe:

          $array_kompakt:

          Array
          (
              [0] => Array
                  (
                      [0] => 110
                      [1] => 15
                      [2] => 2
                  )

          [1] => Array
                  (
                      [0] => 110
                      [1] => 15
                      [2] => 2
                  )

          ...

          [10] => Array
                  (
                      [0] => 110
                      [1] => 15
                      [2] => 2
                  )

          )

          In meinem Script wo

          $array_kompakt[$i][0]=$n1;

          $array_kompakt[$i][1]=$n2;

          $array_kompakt[$i][2]=$n3;

          Wollte ich Feld Position 0 1 2 mit $y hochzählen aber das ist total falsch?
          Warum Du für Deine Lösung kein foreach mehr brauchst verstehe ich nicht wirklich?

          Gruß Michael

          1. Ok,

            ich habe es nun nach einem kleinen Päuschen selbst gelöst ;-)

            Im Prinzip nicht schwer aber die Übung fehlt noch...

            Gruß Michael

          2. Hallo Michael,

            Sportschau war ok, VfB hat gewonnen (Ole Ole...) ;-P
            Ich habe bereits gelesen das Du selbst zu einer Lösung gelangt bist, das super! Ich schreibe hier nur noch was ich mit meinem vorigen Posting genau meinte.

            Das mit error_reporting(E_ALL) kannte ich noch nicht darum werde ich mich nach mein Problem kümmern.

            Die Funktion setzt halt den Grad ab wann PHP Fehlermeldung anzeigen soll. IMHO sollte dies immer auf E_ALL stehen solange man an einem Script arbeitet.
            Hinweis aus Handbuch "Programmieren mit PHP" von O'Reilly S. 331:
            Stellt man das Script online sollte man das Error reporting sogar auf 0 stellen, d.h. es sollen keine Fehler ausser Parseerrors ausgeben werden.

            array_fill kann ich für mein Problem nicht gebrauchen?

            Nee, das war jetzt mehr so ausm Kopf überlegt, ob es anstatt mit einer Schleife nicht auch mit einer PHP-internen Funktion gehen könnte...

            Wollte ich Feld Position 0 1 2 mit $y hochzählen aber das ist total falsch?

            Nee, das ist das wohl der richtige Ansatz...

            Warum Du für Deine Lösung kein foreach mehr brauchst verstehe ich nicht wirklich?

            Weil ich lieber eine for-Schleife genommen habe da diese schon mit einer Zählvariablen arbeitet die auch gleich für die Zuweisung des Array-Indizes nehmen kann... Ob das der Weisheits letzter Schluss ist weiss ich auch nicht, für mich siehts jedenfalls recht kompakt und übersichtlich aus :-)

            Grüsse AndreD

            1. Hinweis aus Handbuch "Programmieren mit PHP" von O'Reilly S. 331:
              Stellt man das Script online sollte man das Error reporting sogar auf 0 stellen, d.h. es sollen keine Fehler ausser Parseerrors ausgeben werden.

              Error reporting ist das auch eine Einstellung in der php.ini ?
              Warum soll denn der Online auf 0 stehen? Werden dann keine Fehler mehr angezeigt? Ich meine damit wenn mal die Datenbank ausfällt gibt da sieht man immer so lange Fehlermeldungen...

              Um welche Auflage handelt es sich um Dein O'Reilly Buch? Ich habe hier schon 3 verschiedene PHP Bücher ich meine lohnt es sich noch das Buch noch zu holen? Ich denke das macht nur Sinn wenn es sich auch auf die neuste PHP Version bezieht evtl schon PHP5

              Ich habe es auch mit einer for Schleife gelöst.

              1. Hallo,

                Error reporting ist das auch eine Einstellung in der php.ini ?

                Ja das kann man in der php.ini quasi "global" einstellen, d.h. die dort vorgenommene Einstellung wird auf dem Server verwendet.
                Du kannst halt auch innerhalb Deines Scriptes z.B. in einer zentralen config-Datei über die Funktion error_reporting() das Error-Level setzen.

                Warum soll denn der Online auf 0 stehen? Werden dann keine Fehler mehr angezeigt? Ich meine damit wenn mal die Datenbank ausfällt gibt da sieht man immer so lange Fehlermeldungen...

                Naja, die gehen halt davon aus das man mögliche Fehler wie z.B. bei der Datenbankverbindung selbst überprüft und durch eigene Fehlermeldungen abfangen möchte. Ich denke halt das zum einen die Darstellung der Applikation gewahrt wird und zum anderen der User eine sauber formulierte (möglicherweise in versch. Sprachen) Fehlermeldung angezeigt bekommt anstatt der PHP-Ausgabe. Dann habe ich mal noch gelesen das findige Hacker anhand solcher Standardfehlermeldungen Rückschlüsse auf mögliche Schwachstellen im Script schliessen könnten, mit diesem Argument bin ich mir aber im Moment nicht ganz sicher ;-)

                Um welche Auflage handelt es sich um Dein O'Reilly Buch? Ich habe hier schon 3 verschiedene PHP Bücher ich meine lohnt es sich noch das Buch noch zu holen? Ich denke das macht nur Sinn wenn es sich auch auf die neuste PHP Version bezieht evtl schon PHP5

                Das ist die erste Auflage von 2003 und es geht halt ausschliesslich um PHP4, die behandeln auch die Grundlagen nochmal durch, geben aber auch sehr gute Praxistipps. Ich bin mit dem Buch eigentlich rundum zufrieden. Wenn Dich auch fortgeschrittene Themen interessieren kann ich Dir "PHP de Luxe" vom mitp-Verlag empfehlen. Da werden dann halt Dinge wie PEAR::DB, Templatesysteme wie Smarty, Modularisierung etc. vorgestellt. Dieser Schinken konnte mich - trotz des hohen Preises (39.95 Euro) - auch sehr begeistern :-)

                Ich habe es auch mit einer for Schleife gelöst.

                Dito, und IMHO im Augenblick die einzig gescheite Lösung :-)

                Grüsse AndreD

                1. Um welche Auflage handelt es sich um Dein O'Reilly Buch? Ich habe hier schon 3 verschiedene PHP Bücher ich meine lohnt es sich noch das Buch noch zu holen? Ich denke das macht nur Sinn wenn es sich auch auf die neuste PHP Version bezieht evtl schon PHP5
                  Das ist die erste Auflage von 2003 und es geht halt ausschliesslich um PHP4, die behandeln auch die Grundlagen nochmal durch, geben aber auch sehr gute Praxistipps. Ich bin mit dem Buch eigentlich rundum zufrieden. Wenn Dich auch fortgeschrittene Themen interessieren kann ich Dir "PHP de Luxe" vom mitp-Verlag empfehlen. Da werden dann halt Dinge wie PEAR::DB, Templatesysteme wie Smarty, Modularisierung etc. vorgestellt. Dieser Schinken konnte mich - trotz des hohen Preises (39.95 Euro) - auch sehr begeistern :-)

                  Mit Pear kann ich momentan noch nicht viel Anfangen ich glaube diese Klassen müßen dann auch auf dem Webserver installiert sein um darauf Zugriff zuhaben oder wie soll das gehen?

                  Von Smarty habe ich die Tage gelesen, das soll doch den Code vom Design trennen?

                  Vielleicht sollte ich mir das O'Reilly Buch holen die machen glaub nur gescheite Bücher. Meine Bücher sind wiederum 3 Jahre alt...

                  Ansonsten findet man auch gute Bücher bei terrashop.de für 30-80 % unterm Preis ist wie gesagt dann auch immer die alte Auflage aber was sollts...

                  1. Hallo,

                    Mit Pear kann ich momentan noch nicht viel Anfangen ich glaube diese Klassen müßen dann auch auf dem Webserver installiert sein um darauf Zugriff zuhaben oder wie soll das gehen?

                    Nö, AFAIK kannst Du die Klassen auch ohne Adminrechte installieren. Falls es Dich interessiert bekommst Du evt. bei http://pear.php.net/manual/en/installation.php

                    Von Smarty habe ich die Tage gelesen, das soll doch den Code vom Design trennen?

                    Smarty ist schon ein recht mächtiges Templatesystem mit eigenem Seitencaching. Ja, Templates benutzt man in erster Linie um die Darstellung (also das Design) vom Code (also der Programmierlogik) zu trennen. Das ist auch eine gute Sache, allerdings verwischt das ganze bei Smarty wieder ein wenig, da man in Smarty in den Templates wiederum vielfältige Möglichkeiten einer Programmier- oder zumindest Scriptsprache hat: Du kannst if else und for-Schleifen oder sogar Smartyeigene Funktionen im Template nutzen. Spätestens hier wird von einem Designer auch ein wenig Verständnis in Sachen Programmierlogik gefordert wenn dieser da mal was ändern soll. Mehr Infos über Smarty und das (deutsche) Manual gibts bei http://smarty.php.net/

                    Vielleicht sollte ich mir das O'Reilly Buch holen die machen glaub nur gescheite Bücher. Meine Bücher sind wiederum 3 Jahre alt...

                    Mir hats sehr gut gefallen, ich fand es auch nicht zu trocken. Bei Amazon sind die Rezenten auch zufrieden, es stimmt dass das Buch nicht unbedingt für absolute Anfänger geeignet ist.

                    FYI:
                    ----

                    Programmieren mit PHP -> http://www.amazon.de/exec/obidos/ASIN/3897211777/qid=1075587445/sr=2-1/ref=sr_aps_prod_1_1/302-5692739-8502402

                    PHP de Luxe -> http://www.amazon.de/exec/obidos/ASIN/3826607996/qid%3D1075587581/302-5692739-8502402

                    Ansonsten findet man auch gute Bücher bei terrashop.de für 30-80 % unterm Preis ist wie gesagt dann auch immer die alte Auflage aber was sollts...

                    Kenne ich noch nicht, aber ich schau eigentlich schon das ich mir eine aktuelle Auflage besorge, wenn ich mir schon mal ein Fachbuch kaufe! :-)

                    Gruß AndreD