Malcolm Beck´s: array next gibt bool(false) zurück

hi,

ich versuche mich gerade an den Funktionen „current()“ und „next()“, aber ich komme an keine der beiden Array-Werte.

Die Situation sieht so aus:

Ich erstelle mir aus Datenbankeinträgen ein Array; ein var_dump($haupt_links_array); liefert folgendes:

array(4) {  
  ["equipment"]=>  
  string(9) "Equipment"  
  ["scratchen"]=>  
  string(9) "Scratchen"  
  ["mixen"]=>  
  string(5) "Mixen"  
  ["beatjuggling"]=>  
  string(12) "Beatjuggling"  
}

Wenn ich nun versuche, auf current() oder next() zuzugreifen, passiert nichts, also eine Testausgabe:

var_dump( current ($haupt_links_array));

das liefert mir ein bool(false), nur warum? Das Array ist doch vorhanden.

Ein kleiner gegentest mit einem testarray funktioniert tadellos:

$test = array('sh' => 'asd','srj' => 'asdrgas','sthj' => 'asdgr');

Hier komme ich sowohl an current() als auch an next(), warum nicht mit meinem aus der Datenbank stammenden array?

mfg

--
echo '<pre>'; var_dump($Malcolm_Beck`s); echo '</pre>';
array(2) {
  ["SELFCODE"]=>
  string(74) "ie:( fl:) br:> va:? ls:? fo:) rl:| n4:# ss:{ de:? js:} ch:? sh:( mo:? zu:("
  ["Meaningful"]=>
  string(?) "Der Sinn des Lebens ist deinem Leben einen Sinn zu geben"
}
  1. Hi!

    Hier komme ich sowohl an current() als auch an next(), warum nicht mit meinem aus der Datenbank stammenden array?

    Da ich nicht alle Infos habe, ein Schuß ins Blaue:
    reset() versucht?

    Gute N8!

    off:PP

    --
    "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
    1. hi,

      Da ich nicht alle Infos habe, ein Schuß ins Blaue:

      Welche Infos fehlen (für die Zukunft)?

      reset() versucht?

      Ja, so funktioniert es, Danke für den Link!

      Eine folgefrage hätte ich da aber noch; wie komme ich an den Schlüssel des Arrays? Mit Current und Next bekomme ich ja immer den Value, ich benötige aber das Key; in der Doku steht leider nichts dazu.

      mfg

      --
      echo '<pre>'; var_dump($Malcolm_Beck`s); echo '</pre>';
      array(2) {
        ["SELFCODE"]=>
        string(74) "ie:( fl:) br:> va:? ls:? fo:) rl:| n4:# ss:{ de:? js:} ch:? sh:( mo:? zu:("
        ["Meaningful"]=>
        string(?) "Der Sinn des Lebens ist deinem Leben einen Sinn zu geben"
      }
      1. Hi,

        Eine folgefrage hätte ich da aber noch; wie komme ich an den Schlüssel des Arrays? Mit Current und Next bekomme ich ja immer den Value, ich benötige aber das Key; in der Doku steht leider nichts dazu.

        Doch, die verlinkt bspw. von der current-Beschreibung auch auf key().

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. hi,

          Doch, die verlinkt bspw. von der current-Beschreibung auch auf key().

          Danke und sorry, hatte diesen Link überlesen.

          mfg

          --
          echo '<pre>'; var_dump($Malcolm_Beck`s); echo '</pre>';
          array(2) {
            ["SELFCODE"]=>
            string(74) "ie:( fl:) br:> va:? ls:? fo:) rl:| n4:# ss:{ de:? js:} ch:? sh:( mo:? zu:("
            ["Meaningful"]=>
            string(?) "Der Sinn des Lebens ist deinem Leben einen Sinn zu geben"
          }
      2. Hi!

        » Da ich nicht alle Infos habe, ein Schuß ins Blaue:

        Welche Infos fehlen (für die Zukunft)?

        Wie Du das Array mit den Datenbankeinträgen gebastelt hast.
        Außerdem war ich müde und habe Dein Posting nur überflogen. Wie man sieht konnte ich mal wieder, leider nicht einschlafen:((

        » reset() versucht?

        Ja, so funktioniert es, Danke für den Link!

        Beachte bitte im PHP-Manual auch die Warnungen und Hinweise z.B zu current():
        "Es ist nicht möglich, das Ende eines Arrays von einem boolean  FALSE-Wert zu unterscheiden."

        Nur so aus Neugier:  kennst Du foreach?

        off:PP

        --
        "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
        1. hi,

          Wie Du das Array mit den Datenbankeinträgen gebastelt hast.

            if ($kategorien = $dat_verbindung->query($menuAbfrage)) {  
              while ($kategorienRow = $kategorien->fetch_assoc())  
              {  
                $haupt_links_array[$kategorienRow['link_target']] = $kategorienRow['link_name'];  
              }  
            } 
          

          Dieses Array jage ich dann durch eine foreach-Schleife, um eine Navigation daraus zusammen zustückeln.

          Beachte bitte im PHP-Manual auch die Warnungen und Hinweise z.B zu current():
          "Es ist nicht möglich, das Ende eines Arrays von einem boolean  FALSE-Wert zu unterscheiden."

          Ich merke gerade schon, dass mein vorhaben auch mit current() und next() nicht so einfach zu lösen sein wird.

          Nur so aus Neugier:  kennst Du foreach?

          Ja, foreach kenne ich natürlich, nur möchte ich keine Schleife sondern eine „weiterblättern-Funktion“ basteln, daher benötige ich current -- next -- und prev.

          mfg

          --
          echo '<pre>'; var_dump($Malcolm_Beck`s); echo '</pre>';
          array(2) {
            ["SELFCODE"]=>
            string(74) "ie:( fl:) br:> va:? ls:? fo:) rl:| n4:# ss:{ de:? js:} ch:? sh:( mo:? zu:("
            ["Meaningful"]=>
            string(?) "Der Sinn des Lebens ist deinem Leben einen Sinn zu geben"
          }
  2. hi,

    ich hab Gestern meine erste Klasse geschrieben, die mir auch nützlich ist, jetzt habe ich ein zwei fragen zu dieser. Erstmal die Klasse:

    <?php  
      error_reporting(E_ALL);  
      
      /*  
       * Menuklasse  
      */  
      class Menu  
      {  
        function Menu($Url,$Title)  
        {  
          return ($_SERVER['REQUEST_URI'] == '/'.$URL)  // wenn aufgerufene URI = Wert aus dem Array entspricht, keinen Link generieren  
                ? $this->liste = "<li><em>$Title</em></li>"  
                : $this->liste = "<li><a href='$URL'>$Title</a></li>";  
        }  
      }  
      
      /*  
       * Menuarray  
      */  
      $array = array(  
                      'index'      => 'Start'  
                      ,'seite_2'   => 'Infos'  
                      ,'sonstiges' => 'Diverses'  
                     );  
      
      /*  
       * Navigation zusammenbauen  
      */  
      $Navigation = '<ul>';  
      
      foreach ($array as $Url => $Title)  
      {  
        $MyList = new Menu($Url,$Title);  
        $Navigation .= $MyList->liste;  
      }  
      
      $Navigation .= '</ul>';  
      
      echo $Navigation;
    

    Kann mir jemand erklären, wie ich eine 2te Funktion in die Klasse bekomme und wie ich die dann aufrufen kann?

    Oder vielleicht so verständlicher: derzeit erzeuge ich ja mit „new Menu(...)“ ein Objekt(?), nur in meinem Beispiel musste ich die funktion, die in der Klasse steht, auch Menu nennen, da ich andernfalls die Meldung:

    Class 'Menu_ul' not found ...

    bekomme, ich verstehe die Meldung, aber wie umgehe ich diese?

    Ich möchte in der Klasse die möglichkeit haben, mir unterschiedliche Listen generieren zu lassen, nur weiss ich gerad nicht weiter.

    Was ich am ende haben möchte:

      class Menu  
      {  
        // a href mit ID versehen  
        function Menu_1($Title,$URL)  
        {  
          return ($_SERVER['REQUEST_URI'] == '/'.$URL)  // wenn aufgerufene URI = Wert aus dem Array entspricht, keinen Link generieren  
                ? $this->liste = "<li><em>$Title</em></li>"  
                : $this->liste = "<li><a id='currentlink' href='$URL'>$Title</a></li>";  
        }  
      
        // a href ohne ID  
        function Menu_2($Title,$URL)  
        {  
          return ($_SERVER['REQUEST_URI'] == '/'.$URL)  
                ? $this->liste = "<li><em>$Title</em></li>"  
                : $this->liste = "<li><a href='$URL'>$Title</a></li>";  
        }  
      
        // und noch einige weitere Konstallationen oder andere Funktionen  
      }
    

    Wie kann ich mit dem oberen Beispiel ein Objekt erzeugen und mit diesem arbeiten?

    mfg

    --
    echo '<pre>'; var_dump($Malcolm_Beck`s); echo '</pre>';
    array(2) {
      ["SELFCODE"]=>
      string(74) "ie:( fl:) br:> va:? ls:? fo:) rl:| n4:# ss:{ de:? js:} ch:? sh:( mo:? zu:("
      ["Meaningful"]=>
      string(?) "Der Sinn des Lebens ist deinem Leben einen Sinn zu geben"
    }
    1. echo $begrüßung;

      class Menu
          function Menu($Url,$Title)
      Class 'Menu_ul' not found ...

      Das passt nicht zueinander.

      Wenn du eine Funktion mit gleichem Namen wie die Klasse erstellst, ist das ein Konstruktor. Dies ist aber PHP4-Code. Der Konstruktor heißt nun __construct. Nur wenn es diese Methode nicht gibt, ruft PHP eine Methode gleiche dem Klassennamen auf. Und ein return in einem Konstruktor wird ignoriert. Das heißt, der Code wird zwar ausgeführt aber es wird nichts zurückgegeben.

      bekomme, ich verstehe die Meldung, aber wie umgehe ich diese?

      Da ich sie nicht bekomme, kann ich dir nicht weiterhelfen.

      echo "$verabschiedung $name";

      1. hi,

        »   class Menu
        »     function Menu($Url,$Title)
        » Class 'Menu_ul' not found ...

        Das passt nicht zueinander.

        Ich hatte noch eine Funktion „Menu_ul“ in die Klasse geschrieben, daraus resultierte diese meldung.

        Wenn du eine Funktion mit gleichem Namen wie die Klasse erstellst, ist das ein Konstruktor. Dies ist aber PHP4-Code. Der Konstruktor heißt nun __construct. Nur wenn es diese Methode nicht gibt, ruft PHP eine Methode gleiche dem Klassennamen auf. Und ein return in einem Konstruktor wird ignoriert. Das heißt, der Code wird zwar ausgeführt aber es wird nichts zurückgegeben.

        Hmm, dass verstehe ich jetzt nicht; was meinst du mit es gibt keinen Rückgabewert bei return?

          class Menu  
          {  
            function __construct($Title,$URL)  
            {  
              return ($_SERVER['REQUEST_URI'] == '/'.$URL)  // wenn aufgerufene URI = Wert aus dem Array entspricht, keinen Link generieren  
                    ? $this->liste = "<em>$Title</em>"  
                    : $this->liste = "<a href='$URL'>$Title</a>";  
            }  
          }
        

        Das funktioniert genauso, wie ich es vorher hatte, also mit „Menu“ als Funktionsnamen.

          class Menu  
          {  
            function Menu($Title,$URL)  
            {  
              return ($_SERVER['REQUEST_URI'] == '/'.$URL)  // wenn aufgerufene URI = Wert aus dem Array entspricht, keinen Link generieren  
                    ? $this->liste = "<em>$Title</em>"  
                    : $this->liste = "<a href='$URL'>$Title</a>";  
            }  
          }
        

        Da ich sie nicht bekomme, kann ich dir nicht weiterhelfen.

        Also eigentlich suche ich nur eine möglichkeit, in eine einzige Klasse unterschiedliche Funktionen abzulegen und dann über „new“ auf diese zuzugreifen, Beispiel:

          
          class Menu  
          {  
            function MyFunction()  
            {  
              print "Funktion :MyFunction";  
            }  
          
            function OtherFunction($Param_1,$Param_2)  
            {  
              print "Funktion :OtherFunction mit Param: Param_1";  
            }  
          }
        

        Wie kann ich jetzt auf diese einzelnen Funktionen in der Klasse „Menu“ zugreifen? Ist dass überhaupt möglich und für sowas gedacht?

        mfg

        --
        echo '<pre>'; var_dump($Malcolm_Beck`s); echo '</pre>';
        array(2) {
          ["SELFCODE"]=>
          string(74) "ie:( fl:) br:> va:? ls:? fo:) rl:| n4:# ss:{ de:? js:} ch:? sh:( mo:? zu:("
          ["Meaningful"]=>
          string(?) "Der Sinn des Lebens ist deinem Leben einen Sinn zu geben"
        }
        1. echo $begrüßung;

          » Und ein return in einem Konstruktor wird ignoriert. Das heißt, der Code wird zwar ausgeführt aber es wird nichts zurückgegeben.
          Hmm, dass verstehe ich jetzt nicht; was meinst du mit es gibt keinen Rückgabewert bei return?

          Du erzeugt ein neues Objekt einer bestimmten Klasse mit

          new Klassenname()

          Der Rückgabewert von new ist (in aktuellen PHP-Versionen) immer das neue Objekt. Du kannst der Klasse einen Konstruktor spendieren, wenn du Initialisierungsarbeiten hast, die bei der Instantiierung ausgeführt werden sollen. Der kann aber nichts zurückgeben, weil er automatisch beim new aufgerufen wird, was ja aber schon das Objekt selbst zurückgibt. Deshalb ist ein return im Konstruktor wie ein Leben ohne Mops (möglich, aber sinnlos).

          Also eigentlich suche ich nur eine möglichkeit, in eine einzige Klasse unterschiedliche Funktionen abzulegen und dann über „new“ auf diese zuzugreifen, Beispiel:

          new erzeugt ein Objekt. Das ist dann sinnvoll, wenn du Daten im Objekt speichern willst und die Funktionen (Methoden) darauf zugreifen sollen. Sollen die Methoden jedoch als eigenständige Funktionen sein und benötigen keinen Zugriff auf $this, könnten also auch ohne eine Klasse existieren, dann willst du vielleicht statische Methoden schreiben. Du brauchst dann kein Objekt mit new zu erzeugen. Immerhin können aber statische Methoden auf statische Eigenschaften zugreifen. Eine Klasse nur mit statischen Methoden und Eigenschaften nimmt man aber eigentlich nur dann, wenn man die Klasse als Namensraum "missbrauchen" möchte.

          echo "$verabschiedung $name";

          1. hi,

            Der Rückgabewert von new ist (in aktuellen PHP-Versionen) immer das neue Objekt. Du kannst der Klasse einen Konstruktor spendieren, wenn du Initialisierungsarbeiten hast, die bei der Instantiierung ausgeführt werden sollen. Der kann aber nichts zurückgeben, weil er automatisch beim new aufgerufen wird, was ja aber schon das Objekt selbst zurückgibt. Deshalb ist ein return im Konstruktor wie ein Leben ohne Mops (möglich, aber sinnlos).

            Ahh, jetzt hab ich's ;)    zwar noch nicht so richtig verstanden, aber die Klasse funktioniert schon mal.

            new erzeugt ein Objekt. Das ist dann sinnvoll, wenn du Daten im Objekt speichern willst und die Funktionen (Methoden) darauf zugreifen sollen.

            Ich hab mir gerade noch ein Paar Zeilen im ZF angesehen; jetzt habe ich erst verstanden, was da passiert. Ich dachte die ganze Zeit, die ganzen Funktionen in den Zend-Klassen wären eigenständige Funktionen, die im gesamten Script-Verlauf genutzt werden können, dabei sind es ja „Klassen-Interne Funktionen“, auf die nur innerhalb der Klasse zugegriffen wird (so habe ich es jetzt verstanden, ist meine vermutung richtig?).

            Sollen die Methoden jedoch als eigenständige Funktionen sein und benötigen keinen Zugriff auf $this, könnten also auch ohne eine Klasse existieren, dann willst du vielleicht statische Methoden schreiben.

            Ja, genau sowas habe ich gesucht, Danke für den Link!

            Eine Klasse nur mit statischen Methoden und Eigenschaften nimmt man aber eigentlich nur dann, wenn man die Klasse als Namensraum "missbrauchen" möchte.

            Um dem missbrauch vorzubeugen habe ich auch einen Konstruktor in die Klasse eingebaut ;)
            Nein, ich verstehe einfach die OOP-Logik nicht so richtig und versuche einfach mal mit tests hier und da hinter dass Geheimnis zu kommen.

            So sieht nun die Klasse aus:

            class Menu  
            {  
                function __construct($Title)  
                {  
                    $this->liste = "<p>$Title</p>";  
                }  
              
                public static function Level_1()  
                {  
                  return "test level 1";  
                }  
              
                public static function Level_2()  
                {  
                  return "test level 2";  
                }  
            }  
              
              // Zugriff auf das Objekt[?]  
              $MyList = new Menu('Mein Titel');  
              echo $MyList->liste; // Ausgabe: <p>Mein Titel</p>  
              
              // Zugriff auf die einzelnen Methoden[?]  
              echo Menu::Level_1(); // Ausgabe: test level 1  
              
              echo Menu::Level_2(); // Ausgabe: test level 2  
            
            

            mfg
            [?] so richtig Formuliert?

            --
            echo '<pre>'; var_dump($Malcolm_Beck`s); echo '</pre>';
            array(2) {
              ["SELFCODE"]=>
              string(74) "ie:( fl:) br:> va:? ls:? fo:) rl:| n4:# ss:{ de:? js:} ch:? sh:( mo:? zu:("
              ["Meaningful"]=>
              string(?) "Der Sinn des Lebens ist deinem Leben einen Sinn zu geben"
            }
            1. echo $begrüßung;

              Ich hab mir gerade noch ein Paar Zeilen im ZF angesehen; jetzt habe ich erst verstanden, was da passiert. Ich dachte die ganze Zeit, die ganzen Funktionen in den Zend-Klassen wären eigenständige Funktionen, die im gesamten Script-Verlauf genutzt werden können, dabei sind es ja „Klassen-Interne Funktionen“, auf die nur innerhalb der Klasse zugegriffen wird (so habe ich es jetzt verstanden, ist meine vermutung richtig?).

              Wenn vor Methoden oder Eigenschaften ein private oder ein protected steht, sind diese nur für den internen Gebrauch bestimmt. Wenn der Sichtbarkeitsmodifizierer public davorsteht, ist eine allgemeine Verwendung vorgesehen. Nimm zum Beispiel eine Datenbank-Klasse. Die hat eine Methode GibMirDaten(), die public ist. Um aber die Aufgabe zu erfüllen sind intern einige Schritte zu erledigen. Die Verbindung muss aufgebaut und das Statement zusammengesetzt werden. Es muss an das DBMS gesendet und die Daten in Emfang genommen werden. Diese Vorgänge will man vor dem Hauptprogramm verbergen, den Code der Klasse aber trotzdem strukturieren und nicht alles in eine große Methode schreiben. Zumal es ähnliche Methoden gibt (GibMirAndereDaten()), bei denen sich der interne Ablauf nur in wenigen Details unterscheidet und man den vorhandenen Code mehrfach nutzen möchte.

              » Eine Klasse nur mit statischen Methoden und Eigenschaften nimmt man aber eigentlich nur dann, wenn man die Klasse als Namensraum "missbrauchen" möchte.
              Um dem missbrauch vorzubeugen habe ich auch einen Konstruktor in die Klasse eingebaut ;)

              Das hat damit nichts zu tun. Statische Methoden sind (unter PHP) unabhängig von einem Konstruktor. Ich nehme an, sie wurden als Ergänzung zur Klasse erfunden, um spezielle Aufgabenstellungen zu erfüllen. Beispielsweise wenn dafür gesorgt werden soll, dass von einer Klasse nur eine einzige Instanz existieren darf (Singleton-Pattern), macht man den Konstruktor private, was zur Folge hat, dass man von der Klasse nicht mehr mit new ein Objekt erzeugen kann. Man erstellt aber eine statische Methode (GibMirInstanz()) dazu, die man als public deklariert und die die Aufgabe hat, die eine einzige Instanz zu liefern, sie bei der ersten Verwendung vorher zu erzeugen und sich dann dieses erzeugte Objekt für die anderen Interessenten zu merken. Da diese statische Methode zur Klasse gehört, hat sie die Berechtigung, den private-Konstruktor aufzurufen.

              Statische Methoden sind also als Zusatz zu Klassen zu sehen. Allerdings gibt es auch Aufgaben, bei denen man keine Instanz benötigt, aber aus Gründen der Ordnung gern alles unter einem Hut hätte. Beispielsweise eine Klasse, die mathematische Funktionen (Sinus, Cosinus, Max, Min, Exp, usw.) zur Verfügung stellt. Da braucht man keine Instanz, weil man einfach nur aus einem oder mehreren Werten einen neuen Wert berechnet und das war's.

              Für PHP ist eine Math-Klasse weniger sinnvoll, denn es gibt bereits eine ganze Reihe von Funktionen dafür, die man einfach aufrufen kann. Unter PHP ist die OOP ja auch nur ein Zusatz. Unter komplett OOP-designten Sprachen, bei denen es keine eigenständigen Funktionen gibt, kann man das nur mit statischen Methoden lösen, wenn man das Ganze komfortabel handhabbar gestalten will. Jedes Mal erst ein Objekt erzeugen zu müssen, wenn man mal einen Sinus braucht, wäre etwas umständlich.

              So sieht nun die Klasse aus:
              class Menu {
                  function __construct($Title) {
                      $this->liste = "<p>$Title</p>";
                  }

              Das sieht mir eher danach aus, als ob du mit der Klasse Daten verwalten willst und einige Methoden bereitstellen willst, um diese Daten zu be-/verarbeiten. Dann solltest du eher Objektmethoden verwenden, also keine statischen (die Klassenmethoden genannt werden).

              // Zugriff auf das Objekt[?]
                $MyList = new Menu('Mein Titel');
                echo $MyList->liste; // Ausgabe: <p>Mein Titel</p>

              // Zugriff auf die einzelnen Methoden[?]
                echo Menu::Level_1(); // Ausgabe: test level 1
                echo Menu::Level_2(); // Ausgabe: test level 2

              Kann man rein syntaktisch so machen.
              Nur noch mal, falls dir das noch nicht klar ist: Die Verwendung von statischen Methoden ist unabhängig von Instanzen. Du kannst also Menu::Level_1() aufrufen, ohne vorher mit new ein Objekt erzeugt zu haben. (Inwieweit die eine oder andere Vorgehensweise sinnvoll ist, kommt immer auf die Aufgabenstellung an.)

              echo "$verabschiedung $name";

              1. hi,

                erstmal vielen Dank für die ausführliche Erklärung.

                Man erstellt aber eine statische Methode (GibMirInstanz()) dazu, die man als public deklariert und die die Aufgabe hat, die eine einzige Instanz zu liefern, sie bei der ersten Verwendung vorher zu erzeugen und sich dann dieses erzeugte Objekt für die anderen Interessenten zu merken. Da diese statische Methode zur Klasse gehört, hat sie die Berechtigung, den private-Konstruktor aufzurufen.

                Ich glaube, so etwas habe ich Gestern noch programmiert, S.u..

                » class Menu {
                »     function __construct($Title) {
                »         $this->liste = "<p>$Title</p>";
                »     }

                Das sieht mir eher danach aus, als ob du mit der Klasse Daten verwalten willst und einige Methoden bereitstellen willst, um diese Daten zu be-/verarbeiten. Dann solltest du eher Objektmethoden verwenden, also keine statischen (die Klassenmethoden genannt werden).

                Ich versuche es, nur ist dass ganze ja schon für einen Anfänger ziemlich kompliziert.

                »   // Zugriff auf das Objekt[?]
                »   $MyList = new Menu('Mein Titel');
                »   echo $MyList->liste; // Ausgabe: <p>Mein Titel</p>
                »   echo Menu::Level_1(); // Ausgabe: test level 1

                Die Verwendung von statischen Methoden ist unabhängig von Instanzen. Du kannst also Menu::Level_1() aufrufen, ohne vorher mit new ein Objekt erzeugt zu haben. (Inwieweit die eine oder andere Vorgehensweise sinnvoll ist, kommt immer auf die Aufgabenstellung an.)

                Ja, dass ist mir schon klar; das erzeugte Objekt benötige ich aber öfter, als die Statischen Methoden, daher dieses Konstrukt.
                Ich benötige ein und die selbe ausgabe der Klasse drei mal und die Statische Funktion Beispielsweise ein mal.

                Aber ich habe noch ein wenig weiter gegrübelt und einen „Error-handler“ für unvollständige Usereingaben geschrieben:

                  class InputErrorCheck  
                  {  
                    var $error;  
                  
                    function __construct($array) {  
                      if (is_array($array)) {  
                        foreach ($array as $key) {  
                          if (isset($_POST[$key]) AND empty($_POST[$key])) {  
                            $this->error[] = $key;  
                          }  
                        }  
                      }  
                      else {  
                        $this->error = false;  
                      }  
                    }  
                  
                    public static function errorMessage($array,$isKeyOf) {  
                      if(is_array($array)) {  
                        $val = '';  
                          foreach ($array as $key)  {  
                            if ($isKeyOf == 'message') {  
                              $val .= ucfirst($key) . ' - ';  
                            }  
                            else if ($isKeyOf == 'css') {  
                              $val .= '#' . $key . ', ';  
                            }  
                          }  
                        $val = rtrim($val, ' - ');  
                        $val = rtrim($val, ', ');  
                        return $val;  
                      }  
                      else {  
                        return false;  
                      }  
                    }  
                  
                  }
                

                Aufruf:

                    $MyErr = new InputErrorCheck(array('name','beitrag')); // Pflichtfelder definieren, rückgabewert steht als array in $MyErr->error zur verfügung  
                  
                    if ($MyErr->error) // wenn es einen fehler gibt, in Variable für die spätere Ausgabe speichern  
                    {  
                      $CSSNames = InputErrorCheck::errorMessage($MyErr->error, 'css') ; // Pflichtfelder Rot markieren, wenn nicht ausgefüllt  
                  
                      $MyErr->error = '<p class="error required_field">Füllen Sie bitte folgende Felder aus:<br /><em>' // User mitteilen, welche Felder Pflicht sind  
                                    . InputErrorCheck::errorMessage($MyErr->error, 'message')  
                                    . '</em></p>';  
                    }  
                  
                  $ErrCSS = (isset($CSSNames))  
                          ? "\n".'<style type="text/css">' . "$CSSNames {border-color:#F00;}</style>\n"  
                          : '' ;  
                  
                  echo $MyErr->error;  
                
                

                Ich weiss, mit einfachen Funktionen könnte ich das Eleganter lösen, aber dass ist endlich eine Klasse, durch die ich das Prinzip verstehen kann.
                Verbesserungsvorschläge?

                mfg

                --
                echo '<pre>'; var_dump($Malcolm_Beck`s); echo '</pre>';
                array(2) {
                  ["SELFCODE"]=>
                  string(74) "ie:( fl:) br:> va:? ls:? fo:) rl:| n4:# ss:{ de:? js:} ch:? sh:( mo:? zu:("
                  ["Meaningful"]=>
                  string(?) "Der Sinn des Lebens ist deinem Leben einen Sinn zu geben"
                }
                1. echo $begrüßung;

                  Ich weiss, mit einfachen Funktionen könnte ich das Eleganter lösen, aber dass ist endlich eine Klasse, durch die ich das Prinzip verstehen kann.
                  Verbesserungsvorschläge?

                  Nicht viele. Um etwas zu lösen, braucht man die Aufgabenstellung und zwar ziemlich konkret. Aussagekräftigere Bezeichner tragen ebenso wie Kommentare zum Verständnis bei. Statt $array und $key benenn sie nach ihrer Aufgabe. Und schau dir mal PHPDoc an.

                  echo "$verabschiedung $name";

                  1. hi,

                    » Verbesserungsvorschläge?

                    Nicht viele. Um etwas zu lösen, braucht man die Aufgabenstellung und zwar ziemlich konkret. Aussagekräftigere Bezeichner tragen ebenso wie Kommentare zum Verständnis bei. Statt $array und $key benenn sie nach ihrer Aufgabe.

                    Ok, ich kommentiere dass ganze mal nach den Aufgaben:

                      class InputErrorCheck  
                      {  
                        var $error;  
                      
                        /*  
                         * Aufruf: new InputErrorCheck(array('name','beitrag')); -- Pflichtfelder in array definieren  
                         *  
                         * Wenn es einen POST gab, prüfen ob die im Array definierten Felder Leer oder ausgefüllt sind  
                         * Jedes Feld, dass Leer verschickt wurde, wird mit „Namen“ im Array „error“ gespeichert  
                         * alles andere gibt false zurück  
                        */  
                        function __construct($RequiredFields)  
                        {  
                          if (is_array($RequiredFields))  
                          {  
                            foreach ($RequiredFields as $PostKey)  
                            {  
                              if (isset($_POST[$PostKey]) AND empty($_POST[$PostKey]))  
                              {  
                                $this->error[] = $PostKey; // Wenn ein Fehler vorliegt, Array „error“ anlegen und mit Werten füllen  
                              }  
                            }  
                          }  
                          else  
                          {  
                            $this->error = false;  // Ansonsten false zurückgeben  
                          }  
                        }  
                      
                        /*  
                         * Aufruf: InputErrorCheck::errorMessage($MyErr->error, 'css'); -- prüfen, ob ein Fehler vorliegt  
                         * der zweite Parameter gibt an, welchen Rückgabewert ich benötige, also HTML oder CSS  
                         *  
                         * Wenn „CSS“ gewählt wurde, werden die Namen der betroffenen Felder kommasepariert gespeichert und das letzte Komma entfernt  
                         * das kann man dann für eine CSS-Selektierung nutzen  
                         * Rückgabewert „CSS“ (wenn „name“ und „beitrag“ Leer sind): „#name, #beitrag“  
                         * Ausgabe im HTML (nur wenn ein Fehler voliegt): <style type="text/css">$cssError {borer-color:red}</style>  
                         *  
                         * Wenn „message“ als zweiter Parameter angegeben wird, werden die Namen der betroffenen Felder mit einem Bindestrich getrennt zurück gegeben  
                         * Rückgabewert „message“ (wenn „name“ und „beitrag“ Leer sind): „name - beitrag“  
                         * Ausgabe im HTML (auch nur wenn ein Fehler voliegt): Füllen sie die Felder $RequiredInput aus  
                        */  
                        public static function errorMessage($EmptyFields,$isKeyOf)  
                        {  
                          if(is_array($EmptyFields))  
                          {  
                            $AllErrorList = '';  
                              foreach ($EmptyFields as $EmptyKey)  
                              {  
                                if ($isKeyOf == 'message')  
                                {  
                                  $AllErrorList .= ucfirst($EmptyKey) . ' - ';  
                                }  
                                else if ($isKeyOf == 'css')  
                                {  
                                  $AllErrorList .= '#' . $EmptyKey. ', ';  
                                }  
                              }  
                            $AllErrorList = rtrim($AllErrorList, ' - ');  
                            $AllErrorList = rtrim($AllErrorList, ', ');  
                            return $AllErrorList ;  
                          }  
                          else  
                          {  
                            return false;  
                          }  
                        }  
                      
                      }
                    

                    Und im Script, wo ich dann diese Funktion aufrufe sieht es wie folgt aus:

                     $MyErr = new InputErrorCheck(array('name','beitrag')); // Pflichtfelder definieren, rückgabewert steht als array in $MyErr->error zur verfügung  
                      
                     if ($MyErr->error) // wenn es einen fehler gibt (an sich werden die Werte in Variablen gespeichert und später ausgegeben)  
                     {  
                       // Pflichtfelder Rot markieren, wenn nicht ausgefüllt  
                       echo '<style type="text/css">' . InputErrorCheck::errorMessage($MyErr->error, 'css') . ' {border-color:#F00;}</style>' ;  
                      
                       // User mitteilen, welche Felder Pflicht sind  
                       echo '<p>Füllen Sie bitte folgende Felder aus: '  
                            . InputErrorCheck::errorMessage($MyErr->error, 'message')  
                            . '</p>';  
                     }
                    

                    Und schau dir mal PHPDoc an.

                    Danke für den Hinweis, die PHPDoc kannte ich nicht, benutze lediglich dieses Manual.

                    mfg

                    --
                    echo '<pre>'; var_dump($Malcolm_Beck`s); echo '</pre>';
                    array(2) {
                      ["SELFCODE"]=>
                      string(74) "ie:( fl:) br:> va:? ls:? fo:) rl:| n4:# ss:{ de:? js:} ch:? sh:( mo:? zu:("
                      ["Meaningful"]=>
                      string(?) "Der Sinn des Lebens ist deinem Leben einen Sinn zu geben"
                    }
                    1. echo $begrüßung;

                      if (is_array($RequiredFields))
                              foreach ($RequiredFields as $PostKey)
                                if (isset($_POST[$PostKey]) AND empty($_POST[$PostKey]))
                                  $this->error[] = $PostKey; // Wenn ein Fehler vorliegt, Array „error“ anlegen und mit Werten füllen
                            else
                              $this->error = false;  // Ansonsten false zurückgeben

                      Wenn $RequiredFields zwar ein Array ist, aber ein leeres, weil zum Beispiel die Felder alle optional und keine Pflichtfelder sind, bleibt $this->error auf null stehen, was einem false entspricht. Ist das so gewollt?

                      Und im Script, wo ich dann diese Funktion aufrufe sieht es wie folgt aus:
                      $MyErr = new InputErrorCheck(array('name','beitrag')); [...]
                         echo [...] InputErrorCheck::errorMessage($MyErr->error, 'css') [...];

                      Hier brauchst du keine statische Methode sondern kannst eine "normale" verwenden. errorMessage() braucht den Parameter $MyErr->error nicht sondern kann intern auf $this->error zugreifen. Der Aufruf erfolgt à la $MyErr->errorMessage('css'). Statt String für $isKeyOf zu übergeben könntest du Klassenkonstanten (z.B. als Integer) definieren und diese übergeben. Hört sich zwar nach mehr Tipparbeit an, ist aber halb so wild, wenn du eine PHP-IDE mit Codevervollständigung nimmst. Und es geht besser daraus hervor, dass du feststehende Parameterwerte verarbeitest und nicht einfach irgendwelche Stringwerte.

                      Eine statische Methode wäre nur dann angebracht, wenn du auch andere Arrays als das in InputErrorCheck definierte $error prüfen willst.

                      » Und schau dir mal PHPDoc an.
                      Danke für den Hinweis, die PHPDoc kannte ich nicht, benutze lediglich dieses Manual.

                      PHPDoc ist kein Manual sondern eine Art, wie man Funktionen, Variablen, Klassen, etc. mit PHP-Kommentaren versieht. Diese sind auch maschinell auswertbar. Man kann damit beispielsweise eine API-Dokumentation erstellen oder komfortabel mit PHP-Entwicklungsumgebungen arbeiten. Letztere werten die Kommentare aus und können beim Tippen unterstützen durch Anzeige der Funktions- und Parameterbeschreibung und durch Codevervollständigung.

                      echo "$verabschiedung $name";