Andreas: zu blöd für Arrays....

Hallo!
Jetzt habe mich immer schön drücken können, aber jetzt komme ich um arrays nicht mehr drum herum. Sicher, so grob verstehe ich das, ich kann Werte reinschreiben und in einer Schleife auslesen, hab auch zum 10. Mal im Manual dazu gelesen, aber ist aber alles so abstrakt *stöhn*!
Hatte ja unten den Prima Tipp von lulu bekommen mit array_diff(). Nun, im Prinzip klappt das super, nur nicht mit mysql_fetch_array()!!!
Außerdem kann ich diesen Array so auslesen:
while($row=mysql_fetch_array($result)){
echo $row[0];}

Das geht aber mit einfachen Arrays schonmal nicht das geht nur so:

$blumen = array("Rose", "Tulpe", "Nelke", "Sonnenblume");

foreach($blumen as $meine_blume)
  echo $meine_blume,"<br>";

Was ich schon gemerkt habe - das mit "Index => Werte". das Blumen Beispiel bekommt automatisch seinen Index. Rose... sind die Werte.
Wie ist das mit $row=mysql_fetch_array($result), da habe ich nur ein Feld, also habe ich in $row[0] alle Werte stehen, habe ich so das Gefühl!!!

Nur wie bekomme ich aus dem mysql_fetch_array einen "normalen" array, wie oben, so dass ich array_diff() überhaupt benutzen kann?

verzweifelte Grüße
vom an sich stark zweifelnden Andreas

  1. Hallo!

    Hallo,

    Jetzt habe mich immer schön drücken können, aber jetzt komme ich um arrays nicht mehr drum herum.

    Ja, irgendwann geht's nicht mehr ohne, schon gar nicht bei Datenbankanwendungen...

    Nur wie bekomme ich aus dem mysql_fetch_array einen "normalen" array, wie oben, so dass ich array_diff() überhaupt benutzen kann?

    Was du mit mysql_fetch_array bekommst ist ein assoziativer Array (jedes Element hat noch einen "Namen", wie du schon gemerkt hast)
    Versuch's mal mit der Funktion mysql_fetch_row(query_result), die gibt einen normalen numerierten Array zurück. Vielleicht hilft dir das

    Grüße aus Darmstadt
    Benjamin

    1. Hi!

      Ja, irgendwann geht's nicht mehr ohne, schon gar nicht bei Datenbankanwendungen...

      Das traurige an der Sache ist das ich die schon länger benutze - mnur nicht richtig verstehe :)

      Nur wie bekomme ich aus dem mysql_fetch_array einen "normalen" array, wie oben, so dass ich array_diff() überhaupt benutzen kann?

      Was du mit mysql_fetch_array bekommst ist ein assoziativer Array (jedes Element hat noch einen "Namen", wie du schon gemerkt hast)
      Versuch's mal mit der Funktion mysql_fetch_row(query_result), die gibt einen normalen numerierten Array zurück. Vielleicht hilft dir das

      OK. bringt mich leider auch nicht viel weiter. Vielleicht kannst Du mir ja folgendes erklären:

      Warum gibt mir das richtigerweise "3" wieder:
      <?
      $array1 = array ("x" => 1, 2, 3);
      $array2 = array ("css" => 4, 1, 2);
      $result = array_diff ($array1, $array2);

      echo $result[1];
      ?>

      und das nix!!!
      <?
      $array1 = array (1, 2, 3);
      $array2 = array (4, 1, 2);
      $result = array_diff ($array1, $array2);

      echo $result[1];
      ?>
      Ich verstehe das alles nicht.

      bei mir sieht das so aus:
      <?
      $belegt=mysql_fetch_row($res);

      $plaetze = array ("a" => 1, 2, 3, 4, 5, 6);

      $frei = array_diff($plaetze,$belegt);
      echo $frei[0].$frei[1].$frei[2];
      ?>

      wenn ich mysql_fetch_row($res); vorher durch eine Schleife schicke bekomme ich folgende Werte: 1,2,3,5

      Also müßte ich hier irgendwie 4 oder 6 angezeigt bekommen - so wie es jetzt ist kommt immer 234
      vorher, mit mysql_fetch_array kam immer 3...
      Totaler Quatsch alles, ich hab schon einiges probiert, das Problem ist einfach das ich nicht genau weiß wie der array mysql_fetch_row aussehen würde, wenn ich Ihne selbst erzeugen würde - array (1, 2, 3, 5); hätte ich mal vermutet, aber das ginge mit array_diff eh nicht - ich verstehs halt nicht, udn was ist auf einmal für ein Unterschied, wenn ich statt array ("x" => 1, 2, 3) nur noch array (1, 2, 3) habe??? Der letzte Array ist der einzige den ich wirklich glaube zu verstehen :))
      Bin ich einfach zu doof?????
      Das kann doch alles nicht sein? Außerdem wäre ich mit sämtlichen anderen Lösungen schon für 2 Stunden fertig gewesen... aber jetzt will ichs endlich mal wissen!

      Grüße
      Andreas

      1. Also ich habe ehrlich gesagt keinen blassen Schimmer mehr, oder irgendwie stehe ich total auf dem Schlauch. Irgendwie musst du das ' "x" => ' in deinen Array, der aus der Datenbank kommt, hineinbekommen, damit deine Funktion array_diff läuft. <grübel>Aber wie ging das nochmal ? ...</grübel>

        udn was ist auf einmal für ein Unterschied, wenn ich statt array ("x" => 1, 2, 3) nur noch array (1, 2, 3) habe???

        also ich denke, daß es da einen Unterschied gibt, aber vor einem solchen Problem stand ich noch nicht

        Viele Grüße aus Darmstadt
        Benjamin

        1. Hi!

          also ich denke, daß es da einen Unterschied gibt, aber vor einem solchen Problem stand ich noch nicht

          lies mal das: http://forum.de.selfhtml.org/?m=54665&t=9847

          Grüße
          Andreas

  2. Huhu Andreas

    Wie ist das mit $row=mysql_fetch_array($result), da habe ich nur ein Feld, also habe ich in $row[0] alle Werte stehen, habe ich so das Gefühl!!!

    Nicht wirklich, $row ist ein Array, dessen Anzahl der Elemente von Deiner SQL-Abfrage abhängt. Im mysql_fetch_array kannst du einen optionalen 2. Parameter benutzen um zu bestimmen, ob Du ein numerisches Array, ein Assoziatives oder beides haben möchtest.

    Z.B.
    $sql="SELECT Spalte1,Spalte2,Spalte5 FROM etc.";

    [...]
    $row=mysql_fetch_array($result,MYSQL_NUM);
    liefert dann folgendes Array mit 3 Elementen
    $row[0]= Wert von Spalte1;
    $row[1]= Wert von Spalte2;
    $row[2]= Wert von Spalte5;

    $row=mysql_fetch_array($result,MYSQL_NUM);
    liefert dann dieses Array mit 3 Elementen
    $row[Spalte1]= Wert von Spalte1;
    $row[Spalte2]= Wert von Spalte2;
    $row[Spalte5]= Wert von Spalte5;

    $row=mysql_fetch_array($result,MYSQL_BOTH);
    liefert dann dieses Array mit 6 Elementen
    $row[Spalte1]= Wert von Spalte1;
    $row[Spalte2]= Wert von Spalte2;
    $row[Spalte5]= Wert von Spalte5;
    $row[0]= Wert von Spalte1;
    $row[1]= Wert von Spalte2;
    $row[2]= Wert von Spalte5;

    Viele Grüße

    lulu

    1. Hi!

      $row=mysql_fetch_array($result,MYSQL_BOTH);
      liefert dann dieses Array mit 6 Elementen
      $row[Spalte1]= Wert von Spalte1;
      $row[Spalte2]= Wert von Spalte2;
      $row[Spalte5]= Wert von Spalte5;
      $row[0]= Wert von Spalte1;
      $row[1]= Wert von Spalte2;
      $row[2]= Wert von Spalte5;

      Das kenne ich in und auswendig, das Probel mist aber das ich EINE Spalte habe und 6 Datensätze!!! Ich muß für array_diff einen array der art array("a" => 1,2,3,4,5) haben.
      so langsam verstehe ich wenigstens was ich gemacht habe, einen Array der art: array(Spalte1,Spalte2,Spalte3,Spalte4,Spalte5)

      Was ich aber brauche ist: array("a" => Datensatz1.Spalte1,Datensatz2.Spalte1,Datensatz3.Spalte1,Datensatz4.Spalte1,Datensatz5.Spalte1) haben. (man beachte auch "a"=> wie komme ich daran?) Wie bekomme ich das hin??? Ich hatte auch versucht :

      $row=mysql_fetch_array($result)
      und dann $row[0] als Array zu verwenden - geht aber nicht - "sei kein Array"?!

      Hmmmmmm.

      Grüße
      Andreas

      Viele Grüße

      lulu

      1. Huhu Andreas

        Was ich aber brauche ist: array("a" => Datensatz1.Spalte1,Datensatz2.Spalte1,Datensatz3.Spalte1,Datensatz4.Spalte1,Datensatz5.Spalte1) haben. (man beachte auch "a"=> wie komme ich daran?) Wie bekomme ich das hin??? Ich hatte auch versucht :

        Vielleicht so:

        $haystack=array();
        while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
        $haystack[]=$row[Spalte1];
        }

        jetzt hast Du ein Array haystack, welches von allen Datensätzen Spalte1 enthält.

        Der Rest ist einfach:

        $arr=array('a'=> $haystack);

        Viele Grüße

        lulu

        1. Hi!

          Der Rest ist einfach:

          :)))) Nun ja....

          $arr=array('a'=> $haystack);

          was ist bitte der Unterschied zw.
          $arr=array('a'=> $haystack); und $arr=array( $haystack);??
          Warum geht nur das erte mit array_diff() und das 2. nicht???

          Grüße
          Andreas

          1. Huhu Andreas

            $arr=array('a'=> $haystack);

            was ist bitte der Unterschied zw.
            $arr=array('a'=> $haystack); und $arr=array( $haystack);??

            im ersten Fall bekommst Du ein assoziatives Array mit genau einem Key-Value Paar nämlich

            $arr['a'] => $haystack;

            im zweiten Fall im Prinzip das gleiche halt nur mit nummerischem Key

            $arr[0] => $haystack;

            Warum geht nur das erte mit array_diff() und das 2. nicht???

            poste doch bitte nochmal den Teil mit array_diff.

            Viele Grüße

            lulu

            1. Hi!
              Mal alles zusammen:

              $query = "SELECT * FROM produkte";
              $res = mysql_query($query, $link);

              $haystack=array();

              while($row=mysql_fetch_array($res)){
              $haystack[]=$row[0];
              echo $row[0]."<br>";}

              #$belegt=array("a" => $haystack);

              $belegt= array ("a" => 1, 2, 2, 3, 5);
              $plaetze = array ("b" => 1, 2, 3, 4, 5, 6);

              $result = array_diff($plaetze,$belegt);

              So, wie es jetzt da steht geht es - aber so bringt es nichts. Habe testweise $belegt=array("a" => $haystack);  auskommentiert und den Array, den ich gerne hätte hingeschrieben - das geht.( echo $result[0] gibt "4" aus!)

              Also kommt da nicht der richtige array bei raus.

              Ich habe auch ein echo eingefügt, welches mir die Werte in der Schleife zurückgibt:
              1
              2
              2
              3
              5
              Kann das denn sein???
              Was interessant ist, die "1" scheint anzukommen, denn echo $result[0].$result[1].$result[2]; gibt mir 234 aus!

              Ne Idee?
              Grüße
              Andreas
              PS: habe auch mysql_fetch_row probiert :(((

              1. Yo!

                Ich kommentiere das mal:

                $query = "SELECT * FROM produkte";
                $res = mysql_query($query, $link);

                // Eine SQL-Abfrage wird gestartet...

                $haystack=array();

                // Definition einer noch leeren Array-Variablen

                while($row=mysql_fetch_array($res)){

                // Solange die Datenbank Daten hergibt, weise jede Ergebniszeile als Mischarray der Variablen $row zu.

                $haystack[]=$row[0];

                // Hänge ans Ende der Variablen $haystack den Wert der ersten Spalte der SQL-Abfrage. Es ergibt sich eine Liste in einem Array. [*1]

                echo $row[0]."<br>";}

                // Kontrollweise Ausgabe

                #$belegt=array("a" => $haystack);

                // Das ist auskommentiert, und dessen Sinn behandle ich gleich. [*2]

                $belegt= array ("a" => 1, 2, 2, 3, 5);
                $plaetze = array ("b" => 1, 2, 3, 4, 5, 6);

                // Definition zweier Misch-Hashs-Arrays. [*3]

                $result = array_diff($plaetze,$belegt);

                // Die fragliche Differenzbildung. [*4]

                Kommentare zu den Anmerkungen:
                [*1]
                Das ist eine trickreiche Funktion, die man einfach kennen muß: Wenn ein Array exitiert, kann man mit $arrayname[1] einzelne, definierte ELemente ansprechen, oder mit $arrayname[] am Ende des Arrays ein neues Element erzeugen. Es hat dann einen Index, der um 1 größer ist als der bisher größte Index.

                [*3]
                Deine Arraydefinition ist fehlerhaft. Die Frage ist doch: Was macht das "a" dort? Ein Variablenname kann es nicht sein, denn der lautet $belegt oder $plaetze. Lösung: Du definierst hier einen Hash-Eintrag! Du kannst mit $belegt['a'] auf die Variable zugreifen und erhälst als Ergebnis die zugewiesene 1. Außerdem definierst du noch vier weitere Einträge, die aber nur als Arrayindices eingetragen werden - von Anfang an, also beginnend bei Null.
                $belegt= array ("a" => 1, 2, 2, 3, 5); erzeugt:
                ['a'] = 1
                [0] = 2
                [1] = 2
                [2] = 3
                [3] = 5

                [*2]
                Entsprechend ist diese Zuweisung völliger Schwachsinn, wenn du ein Array $haystack behalten willst. Das, was diese Anweisung macht, ist:
                Erzeuge eine Variable $belegt, trage den Hashwert "a" ein und weise als Wert ein Array zu.

                Zugreifen könntest du auf die Einzelwerte dann als $belegt['a'][0] - ist aber nicht das, was du willst, oder?

                [*4]
                Für die Differenz der Arrays kommt es nur auf den Inhalt an. Es ist egal, ob eine gespeicherte "2" den Index 3, 0 oder "a" hat. Aber entscheidend ist: Was bleibt im Array übrig. Wenn deine Indices nicht stimmen, kriegst du fehlerhafte Ergebnisse.

                Ich bin der festen Überzeugung, daß $haystack ein wunderbares, mit Zahlen indiziertes Array ist, welches du direkt verwenden kannst. Ebenso erzeugt $platz = array (1,2,3,4,5,6,7,8,9,10) ein gleichartiges, ebenfalls zahlenindiziertes Array.

                Großes PS: Wenn du wissen willst, was in den Variablen drinsteht, nimm die Funktion "var_dump":

                var_dump($belegt); hätte dir gleich gezeigt, was du da definierst, nämlich Müll:
                array(5) { ["a"]=> int(1) [0]=> int(2) [1]=> int(2) [2]=> int(3) [3]=> int(5) }

                - Sven Rautenberg

                1. Hi Sven!
                  Du bist mein absolut unangefochtener, heiliger und hoch veehrter PHP-Gott :))))
                  Vielen Dank für die Leerstunde!
                  Was ich aber sagen muß - daß das mit "a" => nicht nötig war hatte ich kurz vorher selbst gemerkt, und alles dem entsprechend verwendet, und den Array aus der schleife direkt verwendet - und es klappte - aber ich wußte natürlich nicht so genau warum das jetzt so ist.... aber nach der Lektüre Deines Postings verstehe ich es!
                  Vielen Dank dafür!

                  Womit die vermeindlich(auf den ersten Blick) einfachste Methode mal wieder die mit Abstand komplizierteste war - aber dafür hab ich wieder was gelernt, ist ja auch nicht zu verachten!

                  Wobei, wenn mans mal verstanden hat ist es wieder einfach, naja - Vielen Dank Euch 3 für die Hilfe!

                  Viele Grüße
                  Andreas

  3. hi,

    ich werd mich hier mal einschalten

    $alle_plaetze = array (1, 2, 3, 4, 5);

    $get = mysql_query("SELECT * FROM plaetze WHERE belegt='true'");
    if ($belegter_platz = mysql_fetch_array($get)) { // gibt es überhaupt einen belegten platz wenn ja
      do { // dann ein array erstellen wo die IDs von allen belegten Plätzen drinsteht
        $belegte_plaetze[] = $belegter_platz["id"];
      } while ($belegter_platz = mysql_fetch_array($get));
    }

    $freie_plaetze = array_diff($alle_plaetze, $belegte_plaetze);

    foreach ($freie_plaetze as $platz) {
      echo "Platz Nummer:" . $platz . "<br>";
    }

    vielleicht hilft ja das, so ungefähr sollte es funktionieren

    schöne grüße
    FICHTL

    1. Hi! Danke für den Vorschlag, aber Problem ist das noch nichtmal das funktioniert:

      $array1 = array (1, 2, 3);
      $array2 = array (4, 1, 2);
      $result = array_diff ($array1, $array2);

      da kommt gatr nichts bei raus!

      Könnte das Problem irgendwas damit zu tun haben:

      Anmerkung: Zwei Elemente werden nur dann als gleich angesehen, wenn (string) $elem1 === (string) $elem2. In Worten: Wenn die String-Repräsentation die gleiche ist.

      ???

      Grüße
      Andreas

      1. Huhu Andreas

        $array1 = array (1, 2, 3);
        $array2 = array (4, 1, 2);
        $result = array_diff ($array1, $array2);

        da kommt gatr nichts bei raus!

        bei mir kommt 3 raus.

        Das stimmt dann ja mit der Funktionsbeschreibung überein:

        array_diff() returns an array containing all the values of array1 that are not present in any of the other arguments.

        Weil es ein beliebter, geradezu klassischer Fehler ist frage ich mal:
        Du weißt schon, daß Array-Indizes i.d.R. bei 0 beginnen?

        Viele Grüße

        lulu

        1. Hi lulu!

          bei mir kommt 3 raus.

          Ja, bei mir auch - mein Fehler, sorry! Danach habe ich es hinbekommen!

          Du weißt schon, daß Array-Indizes i.d.R. bei 0 beginnen?

          Ja, wußte ich, aber irgendwie war ich mir ganz ehrlich hinter nicht mehr so sicher - aber jetzt ist u.a. dank Svens Lehrstunde alles geklärt!

          Vielen Dank auch für Deine Hilfe! Von Dir kam ja der Vorschlag!

          Viele Grüße
          Andreas