Stephan: Array

Hallo zusammen,

ich habe eine (warscheinlich) triviale Frage, die mir aber Kopfzerbrechen bereitet:

Ich möchte eine MySQL Abfrage in ein Array holen und dann
an eine Funktion über geben. Irgendwie klappt das aber nicht.

function test ($navigation = array(), $menumode) {
$temp = $menumode;
for ($i=0; $i<sizeof($navigation); $i++) {
 $temp = $temp.$i["name"]."<br>";
}
return $temp;
}

$navi = mysql_fetch_array($result);

echo test($navi ,'Hallo');

Ist das so grundsätzlich falsch, oder geht sowas überhaupt??

Gruß
Stephan

  1. Hi,

    function test ($navigation = array(), $menumode) {

    Erster Fehler. Variablen, die mit einem Standardwert belegt werden können, müssen nach hinten in die Argumentliste, also
    function test ($menumode, $navigation = array())

    $temp = $menumode;
    for ($i=0; $i<sizeof($navigation); $i++) {
     $temp = $temp.$i["name"]."<br>";
    }

    Zweiter Fehler. $i ist ein Integer, die Laufvariable für die Schleife, KEIN Array, auf das man so zugreifen könnte (mit []).
    Richtig wäre:
    $temp = $temp.$navigation[$i]."<br>";

    Aber das funktioniert auch NUR dann, wenn das Array kein assoziatives Array ist, sondern ein durchnummeriertes (in diesem Fall ist es eines, weil mysql_fetch_array ein solches liefert).
    Besser wäre:
    reset($navigation);
    while (list(, $value) = each($navigation))
      $temp .= $value."<br>";

    So kann man die Funktion auch mit assoziatives Arrays aufrufen und es funktioniert.

    Ist das so grundsätzlich falsch, oder geht sowas überhaupt??

    Nicht grundsätzlich, aber doch recht unrichtig :-)

    nix

    1. Hi nix,

      danke für den Tipp!

      Jetzt hab ich nur das Problem dass bei beiden Varianten
      er mit die einzelnen DB-Felder durchläuft und nicht
      die Datensätze.

      Hast vielleicht dazu noch nen kleinen tipp?

      Danke Stephan

      1. Jetzt hab ich nur das Problem dass bei beiden Varianten
        er mit die einzelnen DB-Felder durchläuft und nicht
        die Datensätze.

        Das hab ich nach dem Posten auch gemerkt :-)
        Das liegt daran, dass du nur einmal mysql_fetch_array($result) aufrufst, was dir genau einen Datensatz liefert mit den Feldern als Array-Elemente.

        Nehmen wir an, das Feld in der Datenbank heisst "URL". Dann musst du alle Datensätze auslesen und daraus das Array bilden.

        $navi = array();
        while ($ds = mysql_fetch_array($result, MYSQL_ASSOC))
          $navi[] = $ds['URL'];

        Natürlich kannst du das auch über die Position bestimmen, aber ich bevorzuge die erste Möglichkeit. Der Vollständigkeit halber:

        while ($ds = mysql_fetch_array($result))
          $navi[] = $ds[0];

        Die Annahme ist natürlich, dass es das erste Feld in der Tabelle ist, das gelesen werden soll (Index 0).

        mfg
        nix

        1. :-))

          Okay, aber was ist nun wenn ich das array gerne mehrdimensional
          hätte? So dass ich quasi das array an die funktion übergebe
          und dort dann quasi pro datensatz ein paar felder sehen will?

          Gruß Stephan ;-)

          1. Was mir gerade als einzige sinnvolle Anwendung dazu einfällt, ist eine Navigation mit Link und dem Text dazu, was zwei Feldern in jedem Datensatz entsprechen würde. Ich schreib einfach mal ein bissel Code hin, kannst dann selbst rumbasteln :-)

            function makelinklist($array=array()) // array of links
            {
            $text = "";
            reset($array);
            while (list(, $link) = each($array))
              $text .= "<a href="".$link[0]."">".$link[1]."</a><br>";
            return $text;
            }

            $result = mysql_query("SELECT link, text FROM links");
            $links = array();
            while ($ds = mysql_fetch_array($result))
              $links[] = array($ds[0], $ds[1]);

            echo makelinklist($links);

            das prinzip sollte nun verstanden sein, oder?
            hafe vun ;)
            nix

            1. Jep,

              Prinzip ist verstanden! Denke ich zumindest ;)

              Danke vielmals! :-)

              hafe vun tu ;)

              Stephan

        2. Hello,

          $navi = array();
          while ($ds = mysql_fetch_array($result, MYSQL_ASSOC))
            $navi[] = $ds['URL'];

          Dann kann man auch gleich die destinierte Funktion

          $ds = mysql_fetch_assoc($result)

          benutzen. Die ist geringfügig schneller.

          Grüße

          Tom