luti: Assoziatives Array als Tabelle ausgeben (Pear)

Nabend zusammen,

ich fange gerade damit an, mich in PEAR einzuarbeiten (und bin zunehmend begeisterter vom Funktionsumfang ...). Aber zu Beginn scheitere ich gerade an einer recht einfachen Geschichte. Kann mir da jemand weiterhelfen?

Folgendes: Ich möchte in einem Skript zu Authentifizierung alle User in einer Tabelle ausgeben. Mit $allUsers = $my_auth->listUsers(); lese ich die Benutzer in ein assoziatives Array ein:

Array  
(  
    [0] => Array  
    (  
        [id] => 1 [username] => xyz [password] => 1234 [mod1] => read [mod2] => read  
    )  
    [1] => Array  
    (  
        [id] => 2 [username] => xyz2 [password] => 1234 [mod1] => write [mod2] => read  
    )  
) 

Nun möchte ich das ganze in einer Tabelle ausgeben; dafür würde ich gerne HTML_Table verwenden. Aber HTML_Table scheint nur ein nicht-assoziatives Array als Input zu akzeptieren?!? Ist das tatsächlich so, oder mache ich etwas falsch? Wie kann ihc das elegant lösen?

Hier noch mal der Code-Teil zur Ausgabe:

$table_attr = array( 'width'=>'90%', 'border'=>'1' );  
$table = new HTML_Table($table_attr);  
  
foreach ( $allUsers as $row )  
{  
    $res = $table->addRow($row);  
    if ( PEAR::isError($res) )  
    {  
        echo $res->getMessage();  
    }  
}  
echo $table->toHtml();

Ergsbnis ist eine leere Tabelle mit zwei Spalten ...

Dank & Gruß,
luti

  1. Hellihello

    [0] => Array
        (
            [id] => 1 [username] => xyz [password] => 1234 [mod1] => read [mod2] => read
        )

    Wie wärs mit

      
    <table>  
    <?php foreach ($userArray as $user):?>  
    <tr>  
     <?php foreach ($user as $value):?>  
     <td><?php echo $value?></td>  
     <?php endforeach?>  
    </tr>  
    <?php endforeach?>  
    </table>  
    
    

    ? Anderer Ansatz, klar. PHPs alternative Syntax.

    Dank und Gruß,

    frankx

    --
    tryin to multitain  - Globus = Planet != Welt
    1. Hallo frankx,

      Wie wärs mit
      [...]
      ? Anderer Ansatz, klar. PHPs alternative Syntax.

      Schon klar, aber ich würde halt gerne die Pakete von PEAR verwenden ... Es geht mir eher darum, die prinzipielle Vorgehensweise zu verstehen, als eine schnelle Lösung zu finden.

      Danke trotzdem ...

      Gruß,
      luti

      1. Hellihello

        Schon klar, aber ich würde halt gerne die Pakete von PEAR verwenden ... Es geht mir eher darum, die prinzipielle Vorgehensweise zu verstehen, als eine schnelle Lösung zu finden.

        Zend-Framework lohnt auch einen Blick.

        Dank und Gruß,

        frankx

        --
        tryin to multitain  - Globus = Planet != Welt
        1. Hallo frankx,

          Zend-Framework lohnt auch einen Blick.

          Alles schön und gut - aber wie geht das mit PEAR?

          Dank & Gruß,
          luti

          1. Hellihello

            Alles schön und gut - aber wie geht das mit PEAR?

            Sozusagen die Weiterentwicklung von PEAR. Bei PEAR muss doch stehen, wie es geht. Was als Parameter eingegeben werden kann. Versuch doch mal ein simples Array zuerst.

            Dank und Gruß,

            frankx

            --
            tryin to multitain  - Globus = Planet != Welt
            1. Hallo,

              Sozusagen die Weiterentwicklung von PEAR.

              Was ist die Weiterentwicklung?

              Bei PEAR muss doch stehen, wie es geht. Was als Parameter eingegeben werden kann.

              Ja, das steht da auch: html-table.addrow

              "Must be an indexed array of valid cell contents"

              Versuch doch mal ein simples Array zuerst.

              Damit funktioniert es natürlich ... ;)

              Vielleicht könnte ich einfach das assoziative in ein indiziertes Array umwandeln ... Gibt es da eine PHP-Funktion zu ??? Konnte hier nicht finden ...

              Dank 6 Gruß,
              luti

              1. echo $begrüßung;

                Sozusagen die Weiterentwicklung von PEAR.
                Was ist die Weiterentwicklung?

                Ist es nicht. Auch nicht sozusagen. Es ist eine komplette Neuentwicklung gemäß der neuen OOP-Möglichkeiten in PHP 5. PEAR ist historisch bedingt, noch zu großen Teilen PHP4-Code.

                Vielleicht könnte ich einfach das assoziative in ein indiziertes Array umwandeln ... Gibt es da eine PHP-Funktion zu ??? Konnte hier nicht finden ...

                array_values(). Zum Durchlaufen eines Arrays gibt es übrigens array_map() als funktionalen Ansatz. foreach gibt es natürlich auch.

                echo "$verabschiedung $name";

                1. Hellihello

                  echo $begrüßung;

                  Sozusagen die Weiterentwicklung von PEAR.
                  Was ist die Weiterentwicklung?

                  Ist es nicht. Auch nicht sozusagen. Es ist eine komplette Neuentwicklung gemäß der neuen OOP-Möglichkeiten in PHP 5. PEAR ist historisch bedingt, noch zu großen Teilen PHP4-Code.

                  Jau, wollte gerade im Archiv nach "dedlfix zend pear frankx" suchen, weil ich diese Frage ja schonmal so oder ähnlich stellt. Archiv aber 503.

                  Dank und Gruß,

                  frankx

                  --
                  tryin to multitain  - Globus = Planet != Welt
                  1. Jau, wollte gerade im Archiv nach "dedlfix zend pear frankx" suchen, weil ich diese Frage ja schonmal so oder ähnlich stellt. Archiv aber 503.

                    Auch gestern schon den ganzen Tag ...

                  2. Hallo,

                    Jau, wollte gerade im Archiv nach "dedlfix zend pear frankx" suchen, weil ich diese Frage ja schonmal so oder ähnlich stellt. Archiv aber 503.

                    Google kennt auch das Forumsarchiv :-)
                    http://www.google.de/search?hl=de&q=dedlfix+frankx+zend+pear+site%3Aforum.de.selfhtml.org&btnG=Suche&meta=lr%3Dlang_de, fragt mich aber besorgt, ob ich nicht eher "franky" meinte ...

                    OK, so nette Sachen wie author:dedlfix category:PHP ist da halt nicht drin. Lassen wir uns vom Ergebnis überraschen.

                    Freundliche Grüße

                    Vinzenz

                    1. Hellihello

                      http://forum.de.selfhtml.org/archiv/2008/6/t172927/#m1134126

                      ich dachte, wenn die Suche zu ist, wärs das Forum auch. Denken ist eben Glückssache und man sollte es den Pferden überlassen.

                      Dank und Gruß,

                      frankx

                      --
                      tryin to multitain  - Globus = Planet != Welt
                      1. Hallo,

                        http://forum.de.selfhtml.org/archiv/2008/6/t172927/#m1134126

                        Danke für den Link ...

                        Ich denke, dass ich wohl trotz aller Vorteile von Zend mich in Pear einarbeiten werde. Ich denke, dass ist für meine Bedürfnisse besser geeignet.

                        Noch eine Nachfrage zur "Installation":
                        Ich verstehe das nicht so ganz ... Wenn ich bei (m)einem Webhoster Pear laufen habe und mir einzelne Klassen fehlen - binde ich dann nur diese Klassen über meinen Webspace ein? Geht das einfach mit einem Hochladen der entsprechenden Dateien oder muss ich die auch installieren??? Oder muss ich das komplette Paket "installieren" -> und wieso reicht ein einfaches Kopieren/Hochladen nicht aus? Schlau wäre ja, wenn sich der Hoster um die regelmäßigen Updates kümmert und ich nur meine Spezialklassen pflegen müsste.

                        Antwort auf:

                        Das Zend Framework wird mit dem Zend Studio auch nicht besser. Allgemein hat aber das Zend Studio eine Menge Features, die einem als PHP-Programmierer die Arbeit erleichtern.

                        -> Insbesondere wäre eine Hilfe und Codevervollständigung während der Eingabe sehr hilfreich ... Gibt es so etwas für Pear? Um es mal unfachmännisch auszudrücken ;) Wenn ich

                        $a = new Auth("DB", $params, "myOutput");  
                        $a->s
                        

                        eingegeben habe, würde ich mir ein kleines Auswahlfeld wünschen, dass start() vorschlägt.

                        Gruß,
                        luti

                        1. Hellihello

                          das sind alles Klassen, die eingebunden werden.

                          Mail.php braucht unter Umständen noch Mail/Sonstwas.php und vielleicht auch Pear.php.

                          Du musst schauen, das sie relativ zu Deiner Datei, in der Du das einbindest, im richtigen Verzeichnis liegen.

                          Liegt hast Du httpdocs/my_app/my_mail.php und httpdocs/PEAR dann musst Du entsprechend den include-path setzen im my_mail.php auf "../../PEAR".

                          "Installiert" werden muss nix!

                          Ich verstehe das nicht so ganz ... Wenn ich bei (m)einem Webhoster Pear laufen habe und mir einzelne Klassen fehlen - binde ich dann nur diese Klassen über meinen Webspace ein?

                          Wenn er Pear im Standardincludepfad hat. Probiere doch require_once("Pear.php"), ob du einen Fehler bekommst.

                          -> Insbesondere wäre eine Hilfe und Codevervollständigung während der Eingabe sehr hilfreich ... Gibt es so etwas für Pear? Um es mal unfachmännisch auszudrücken ;) Wenn ich

                          $a = new Auth("DB", $params, "myOutput");

                          $a->s

                          
                          > eingegeben habe, würde ich mir ein kleines Auswahlfeld wünschen, dass `start()`{:.language-php} vorschlägt.  
                            
                          Mit SciTE kannst Du zB. Abkürzungen definieren und es kennt autocomplete, allerdings nur, wenn der String schon einmal im Textfile vorkommt. Möglich, dass man da auch presets definieren kann. Ich kenne einen professionellen Entwickler, der auch schon einiges mit Eclipse und Java gemacht hat und dennoch SciTE nutzt.  
                            
                          Dank und Gruß,  
                            
                          [frankx](http://community.de.selfhtml.org/visitenkarten/view.php?key=82)
                          
                          -- 
                          [tryin to](http://sauer-ernst.de) [multitain](http://multitain.de)  - Globus = Planet != Welt 
                          
                          1. Hallo,

                            hast Du httpdocs/my_app/my_mail.php und httpdocs/PEAR dann musst Du entsprechend den include-path setzen im my_mail.php auf "../../PEAR".

                            Soweit alles ok, Pear läuft lokal unter XAMPP sowie bei meinem Hoster. Es ging mir nur darum zu verstehen, wie ich mit zusätzlichen Paketen umgehen kann/muss, wenn ich diese beim Hoster (oder auch lokal) nutzen möchte. Diesen go-pear Kram würde ich gerne umgehen ...

                            "Installiert" werden muss nix!

                            Das beruhigt mich und beantwortet meine Frage!

                            Mit SciTE kannst Du zB. Abkürzungen definieren und es kennt autocomplete, allerdings nur, wenn der String schon einmal im Textfile vorkommt. Möglich, dass man da auch presets definieren kann. Ich kenne einen professionellen Entwickler, der auch schon einiges mit Eclipse und Java gemacht hat und dennoch SciTE nutzt.

                            Hört sich interessant an ... aber ich denke, ich werde nicht noch eine Baustelle auf machen ;)

                            Dank & Gruß,
                            luti

                        2. echo $begrüßung;

                          Ich verstehe das nicht so ganz ... Wenn ich bei (m)einem Webhoster Pear laufen habe und mir einzelne Klassen fehlen - binde ich dann nur diese Klassen über meinen Webspace ein? Geht das einfach mit einem Hochladen der entsprechenden Dateien oder muss ich die auch installieren??? Oder muss ich das komplette Paket "installieren" -> und wieso reicht ein einfaches Kopieren/Hochladen nicht aus?

                          Soweit ich mich erinnere, sind all diese Fragen im PEAR-Handbuch beantwortet.

                          -> Insbesondere wäre eine Hilfe und Codevervollständigung während der Eingabe sehr hilfreich ... Gibt es so etwas für Pear?

                          Das gibt es wie für jede Funktionsbibliothek. Die IDE muss den Pfad zu den Quellen kennen, dann kann sie sie auch parsen und dich mit ihren Features unterstützen.

                          echo "$verabschiedung $name";

                          1. Hallo,

                            Das gibt es wie für jede Funktionsbibliothek. Die IDE muss den Pfad zu den Quellen kennen, dann kann sie sie auch parsen und dich mit ihren Features unterstützen.

                            Da werde ich mich mal umschauen müssen ... Ich benutze seit einiger Zeit Aptana als Entwicklungsumgebung. Mit dem Auto-Debugging bin ich sehr zufrieden, nur ist es etwas träge. Mal schauen, ob ich da Pear eingebunden bekomme.

                            Dank & Gruß,
                            luti

                2. Hallo,

                  Ist es nicht. Auch nicht sozusagen. Es ist eine komplette Neuentwicklung gemäß der neuen OOP-Möglichkeiten in PHP 5. PEAR ist historisch bedingt, noch zu großen Teilen PHP4-Code.

                  Argh, das wusste ich nicht ... ;(

                  Ich hatte mir vor einiger Zeit auch schon mal Zend angeschaut. Dann war mir der Einstieg in die Model-View-Controller Thematik aber zu umständlich (ich war zu faul bzw. hatte nicht genug Zeit, um genau zu sein). Richtig lustig wird Zend aber wohl auch erst mit dem Zend Studio, aber das ist mir einfach zu teuer!

                  array_values(). Zum Durchlaufen eines Arrays gibt es übrigens array_map() als funktionalen Ansatz. foreach gibt es natürlich auch.

                  Bestens ... muss ich bei den vielen Array-Funktionen übersehen haben. ;) Dann hätte ich mir die eigene Funktion, die ich hierfür geschrieben habe, auch sparen können.

                  Dank & Gruß,
                  luti

                  1. echo $begrüßung;

                    Richtig lustig wird Zend aber wohl auch erst mit dem Zend Studio, aber das ist mir einfach zu teuer!

                    Das Zend Framework wird mit dem Zend Studio auch nicht besser. Allgemein hat aber das Zend Studio eine Menge Features, die einem als PHP-Programmierer die Arbeit erleichtern.

                    aber das ist mir einfach zu teuer!

                    Schau dir Eclipse an, dafür gibt es einige PHP-Plugins, die ebenfalls einen ähnlichen Funktionsumfang bieten.

                    echo "$verabschiedung $name";

            2. Hallo,

              ich habe das jetzt umgangen, indem ich das assoziative in ein indexiertes Array mit einer selbst geschriebenen Funktion umgewandelt habe (s.u.). Nicht die einfachst Lösung, aber naja.

              Jetzt ergibt sich daraus noch eine andere Frage: Ich möchte aus dem assoziativem Array vor der Umwandlung noch einige Felder "löschen", also z.B. alle 'passwort'=>'xyz'. Gibt es dafür eine PHP-Funktion? Ich stelle mir so etwas ähnliches wie array-slice nur für mehrdimensionale assoz. Arrays vor. Idealerweise würde ich die Funktion so aufrufen:

              $newArray = deleteFieldsFromArray($oldArray, array('field1', 'field2'));

              Dank & Gruß,
              luti

              Hier der Code:

              # Funktion zum Umwandeln eines mehrdimensionalen assoziativen Arrays in ein mehrdimensionales indiziertes Array  
              # @input: assoziatives Array  
              # @return: indiziertes Array, bei Fehler: false  
              function assocToIndexedArray($array)  
              {  
               $newarray = array();  
               $i = 0;  
                
               if ( is_array($array) )  
               {  
                foreach ( $array as $key => $wert )  
                {  
                 foreach ( $wert as $wert2 )  
                 {  
                  $newarray[$i][] = $wert2;  
                 }  
                 $i++;  
                }  
                return $newarray;  
               }  
               else  
               {  
                return false;  
               }  
              }
              
              1. Hellihello

                wenn die Funktion nicht für assoziative Arrays gedacht ist, warum nimmst Du sie dafür. Mit alternativer Syntax bist Du doch gut und übersichtlich bedient.

                Ansonsten kannst Du doch mit $toBeDeleted = array("feldname1","feldname2")

                foreach $myArrayOfAssocArrays as $Hash
                 foreach $toBeDeleted as $fieldName
                  unset($Hash[$fieldName]);

                Dank und Gruß,

                frankx

                --
                tryin to multitain  - Globus = Planet != Welt
                1. Hallo,

                  wenn die Funktion nicht für assoziative Arrays gedacht ist, warum nimmst Du sie dafür. Mit alternativer Syntax bist Du doch gut und übersichtlich bedient.

                  Ich hatte ja die Hoffnung, dass sich das Array mit 2 Zeilen Code in die benötigte Form bringen ließe ;) ... Außerdem hatte ich gehofft, auf diesem Wege PEAR etwas besser verstehen zu lernen. Aber naja.

                  foreach $myArrayOfAssocArrays as $Hash
                  foreach $toBeDeleted as $fieldName
                    unset($Hash[$fieldName]);

                  Das hat irgendwie nicht so recht funktioniert. Ich habe daher wieder eine kleine Funktion selber geschrieben (s.u.) ...

                  Dank & Gruß,
                  luti

                  Hier der Code:

                  # Funktion, die die angegebenen Felder aus einem assoziativen Array löscht  
                  # @input: assoziatives Array, Array mit zu löschenden Feldern  
                  # @return: assoziatives Array, bei Fehler: false  
                    
                  function deleteFieldsFromArray($array, $fieldList)  
                  {  
                   $newArray = array();  
                   $i = 0;  
                    
                   if ( is_array($array) && is_array($fieldList) )  
                   {  
                    foreach ( $array as $key => $wert )  
                    {  
                     foreach ( $wert as $key2 => $wert2 )  
                     {  
                      if ( ! in_array($key2, $fieldList) )  
                      {  
                       $newArray[$key][$key2] = $wert2;  
                      }  
                     }  
                     $i++;  
                    }  
                    return $newArray;  
                   }  
                   else  
                   {  
                    return false;  
                   }  
                  }
                  
                  1. Hellihello

                    Ich hatte ja die Hoffnung, dass sich das Array mit 2 Zeilen Code in die benötigte Form bringen ließe ;) ... Außerdem hatte ich gehofft, auf diesem Wege PEAR etwas besser verstehen zu lernen. Aber naja.

                    Verstehen heißt, die passenden Funktionen für Deinen Bedarf zu finden und zu verstehen, dass PEAR im Grunde auf PHP4 basiert, würde ich jetzt sagen.

                    Oder so:

                    <?php  
                      
                    /**  
                     * Funktion, die die angegebenen Felder aus einem assoziativen Array löscht  
                     * @input: Array aus assoziativem Array, Array mit zu löschenden Feldern  
                     * @return: assoziatives Array, bei Fehler: false  
                     */  
                      
                    function deleteFieldsFromArray($hashArray, $fieldNames)  
                    {  
                        if (!is_array($array) || !is_array($fieldList) ) {  
                            return false;  
                        }  
                        foreach ( $hashArray as $key => $hash ) {  
                            foreach ( $fieldNames as $fieldName ) {  
                                unset ($hashArray[$key][$fieldName]);  
                            }  
                        }  
                        return $hashArray;  
                    }  
                      
                    
                    

                    ungetestet.

                    Oder du übergibst das hashArray als Referenz (&$hashArray), dann brauchst Du  es nicht returnen.

                    Dank und Gruß,

                    frankx

                    --
                    tryin to multitain  - Globus = Planet != Welt