NetLook: String umwandeln

Hallo!

Ich möchte ein Array ausgeben

  
$Tiefe = "['getCategoryTreeResult']['Nodes']['Category']";  
  
if($action=='getCategoryTree')  
{  
 $Result=$proxy->getCategoryTree($arr_categories);  
 if($Result['getCategoryTreeResult']['Records']>0)  
  array2table($Result.$Tiefe,true);  
}  

Ich hänge $Tiefe an $Result, um bestimmte Arraywerte zu bekommen, was aber nicht funktioniert, wenn ich es so schreiben würde

  
...  
array2table($Result.['getCategoryTreeResult']['Nodes']['Category'],true);  
...  

funktioniert es. Liegt es daran das $Tiefe ein String ist, wenn ja, wie wandel ich $Tiefe um?

Gruß
NetLook

  1. Hi NetLook!

    Liegt es daran das $Tiefe ein String ist, wenn ja, wie wandel ich $Tiefe um?

    Spalte den String mit den String-Funktionen oder Regex-Funktionen auf und übergib die drei Arrayschlüssel and das Array.
    Brauchst du das häufiger, kannst du eine Funktion schreiben.

    Prototyp:

    function getvaluefromstring($array,$string) {  
    // Teile String und lass dir ein Array der verschiedenen Schlüssel ausgeben (z.B. mit explode,substr und strrev oder preg_split)  
    return $array[$keys[0]][$keys[1]][$keys[2]];  
    }
    

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. Hi, sorry, aber ich kapier das nicht (schäm), ich möchte ja nur statt:

      array2table($Result['getCategoryTreeResult']['Nodes']['Category'],true);

      array2table($Result.$Tiefe,true);

      schreiben können...

      Gruß
      NetLook

      1. Hi NetLook!

        Hi, sorry, aber ich kapier das nicht (schäm), ich möchte ja nur statt:
        array2table($Result['getCategoryTreeResult']['Nodes']['Category'],true);
        array2table($Result.$Tiefe,true);
        schreiben können...

        Das geht nur, wenn du die Funktion array2table entsprechend anpasst. Was mir aber dann reichlich unsinnig erscheinen würde.

        Warum möchtest du das?

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
        1. Hi!

          Ich möchte das Array solange auslesen, bis es die Letzte Unterkategorie ausgelesen hat. Dafür müssen die Array Keys immer wieder erweitert werden. Der Code oben war nur zum testen, von einem original, damit wollte ich testen in welcher "Schreibweise" es funktioniert.

          Hier wie ich es wirklich vorhab:

            
          $Tiefe = "['getCategoryTreeResult']['Nodes']['Category']";  
          $i=0;  
            
            
          function Abfragen($Tiefe){  
            foreach($Result.$Tiefe as $ResultWert){  
             echo "1->: ".$ResultWert."<br>";  
              if(is_array($ResultWert) && !empty($ResultWert)){  
               $Tiefe = $Tiefe."[$i]['Nodes']['Category']";  
               Abfragen($Tiefe);  
               $i++;  
               }  
               else  
               {  
               echo "2->: ".$ResultWert."<br>";  
              }  
            }  
          }  
          
          

          Ist $ResultWert also ein Array, wird $Tiefe mit weiteren Array Keys erweitert und die Funktion damit erneut aufgerufen.

          Eine andere Möglichkeit habe ich bisher nicht gefunden oder hinbekommen. Die Funktion array2Table habe ich mal verändert, aber habe sie nicht so hinbekommen, das einfach alle Werte nur untereinander geschrieben werden. Zudem verstehe ich auch nicht, wie es hier funktioniert, dass das Array komplett durchgegangen wird, ohne das irgendwo neue Array Keys übergeben werden?!

          Hier der Code:

            
          /**  
           * Translate a result array into a HTML table  
           *  
           * @author      Aidan Lister <aidan@php.net>  
           * @version     1.3.1  
           * @link        http://aidanlister.com/repos/v/function.array2table.php  
           * @param       array  $array      The result (numericaly keyed, associative inner) array.  
           * @param       bool   $recursive  Recursively generate tables for multi-dimensional arrays  
           * @param       bool   $return     return or echo the data  
           * @param       string $null       String to output for blank cells  
           */  
            
          function array2table($array, $recursive = false, $return = false, $null = '&nbsp;')  
          {  
              // Sanity check  
           if (empty($array) || !is_array($array)) {  
            return false;  
              }  
            
              if (!isset($array[0]) || !is_array($array[0])) {  
                  $array = array($array);  
              }  
            
              // Start the table  
              $table = "<table>\n";  
            
              // The header  
              $table .= "\t<tr>";  
              // Take the keys from the first row as the headings  
           foreach (array_keys($array[0]) as $heading) {  
            $table .= '<th>' . $heading . '</th>';  
           }  
              $table .= "</tr>\n";  
            
              // The body  
           foreach ($array as $row) {  
                  $table .= "\t<tr>" ;  
            foreach ($row as $cell) {  
             $table .= '<td>';  
            
                      // Cast objects  
                      if (is_object($cell)) { $cell = (array) $cell; }  
            
                      if ($recursive === true && is_array($cell) && !empty($cell)) {  
                          // Recursive mode  
                          $table .= "\n" . array2table($cell, true, true) . "\n";  
                      } else {  
                          $table .= (strlen($cell) > 0) ?  
                              htmlspecialchars((string) $cell) :  
                              $null;  
                      }  
            
                      $table .= '</td>';  
            }  
            
                  $table .= "</tr>\n";  
           }  
            
              // End the table  
              $table .= '</table>';  
            
              // Method of output  
              if ($return === false) {  
                  echo $table;  
              } else {  
                  return $table;  
              }  
          }  
          
          

          Gruß
          NetLook

          1. Hi NetLook!

            Ich möchte das Array solange auslesen, bis es die Letzte Unterkategorie ausgelesen hat.

            Um letztendlich was damit zu tun?
            Möchtest du eine Tabelle ausgeben, eine Liste oder...?

            Ohje... ;-)

              
            // String  
            $Tiefe = "['getCategoryTreeResult']['Nodes']['Category']";  
            $i=0;  
              
            function Abfragen($Tiefe){  
                      // $Result ist nicht definiert, wenn $Result ein Array wäre,  
                      // dann könntest du es nicht mit einem String verknüpfen.  
              foreach($Result.$Tiefe as $ResultWert){  
               echo "1->: ".$ResultWert."<br>";  
                if(is_array($ResultWert) && !empty($ResultWert)){  
                 $Tiefe = $Tiefe."[$i]['Nodes']['Category']";  
                 Abfragen($Tiefe);  
                 $i++;  
                 }  
                 else  
                 {  
                 echo "2->: ".$ResultWert."<br>";  
                }  
              }  
            }  
            
            

            Ist $ResultWert also ein Array, wird $Tiefe mit weiteren Array Keys erweitert und die Funktion damit erneut aufgerufen.

            Das geht aber so nicht.
            Ich habe eine Funktion geschrieben, die aus einem Array eine Liste generiert:

            function array2list($array,$return = false,$start = true) {  
                // Liste wird initialisiert  
                $list = '';  
                if($start) {  
                    // Anfang und Ende der Liste  
                    $list = "<ul>\n".array2list($array,$return,false)."</ul>";  
                } else {  
                    // Wenn Array leer ist, wird abgebrochen  
                    if(!empty($array)) {  
                        // Wenn der Wert $array ein Array ist,  
                        // wird dir Funktion rekursiv aufgerufen  
                        if(is_array($array)) {  
                            foreach($array as $node)  
                                $list .= array2list($node,$return,false);  
                            return $list;  
                        // Listenpunkt wird zurückgegeben  
                        } else {  
                            $list .= "\t<li>".$array."</li>\n";  
                            return $list;  
                        }  
                    }  
                }  
              
                // Ausgabe/Rückgabe der Liste  
                if($return)  
                    return $list;  
                else echo $list;  
            }
            

            Die Funktion array2Table habe ich mal verändert, aber habe sie nicht so hinbekommen, das einfach alle Werte nur untereinander geschrieben werden.

            Okay, jetzt nochmal für mich zum mitschreiben: Du möchtest also alle Inhalt von $array in einer Liste untereinander ausgeben?!

            Zudem verstehe ich auch nicht, wie es hier funktioniert, dass das Array komplett durchgegangen wird, ohne das irgendwo neue Array Keys übergeben werden?!

            Mit der Zeile foreach ($array as $row) { wird das Array zeilenweise ausgelesen und foreach ($row as $cell) { greift dann auf die einzelnen Elemente zu.
            Allerdings funktioniert das nur bis zu zweidimensionalen Arrays.
            Für mehrdimensionale musst du, wie auch bei der Beschreibung der Parameter steht, $recursive=true angeben.

            Ich hoffe, ich konnte helfen.

            MfG H☼psel

            --
            "It's amazing I won. I was running against peace, prosperity, and incumbency."
            George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
            Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
            1. Yo, vielen Dank für das Script! Jetzt möchte ich noch bestimmte Kategorien rausfiltern, also das z.B. nur die Kategorie "Obst" mit Unterkategorien aufgelistet wird. Mal schauen ob ich es hinbekomme :-)

              Gruß
              NetLook

              1. Hi NetLook!

                Yo, vielen Dank für das Script! Jetzt möchte ich noch bestimmte Kategorien rausfiltern, also das z.B. nur die Kategorie "Obst" mit Unterkategorien aufgelistet wird. Mal schauen ob ich es hinbekomme :-)

                Das musst du gar nicht hinbekommen. Rufe die Funktion einfach mit $array['obst'] bzw. $array['foobar'][...]['obst'] auf.

                MfG H☼psel

                --
                "It's amazing I won. I was running against peace, prosperity, and incumbency."
                George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
                Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
                1. Hi!

                  Also irgendwie habe ich einen Knoten im Kopf!

                  Hier ein Teilauszug XML Ausgabe aus der das Array entsteht:

                    
                  <?xml version="1.0" encoding="utf-8" ?>  
                  - <CategoryTree xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://webservices.affili.net/pdws/">  
                    <Records>236</Records>  
                    <ProgramID>3323</ProgramID>  
                    <Title>xxxxx.de</Title>  
                    <LogoURL />  
                  - <Nodes>  
                  - <Category xsi:type="CategoryTreeNode">  
                    <ID>28952084</ID>  
                    <ParentID>0</ParentID>  
                    <Title>Brenner & Massenspeicher</Title>  
                   - <Nodes>  
                    - <Category xsi:type="CategoryTreeNode">  
                     <ID>28952100</ID>  
                     <ParentID>28952084</ParentID>  
                     <Title>CD-Brenner</Title>  
                     - <Nodes>  
                      - <Category xsi:type="CategoryTreeNode">  
                       <ID>28952101</ID>  
                       <ParentID>28952100</ParentID>  
                       <Title>Firewire CD</Title>  
                       <Nodes />  
                    </Category>  
                   </Nodes>  
                  </Category>  
                  
                  

                  Die Liste ist noch viel länger. Jetzt wollte ich daraus nur die Kategorie "Brenner & Massenspeicher" samt Unterkategorien ausgeben lassen:

                    
                  echo array2table($Result['getCategoryTreeResult']['Nodes']['Category']['Title']['Brenner & Massenspeicher']'Nodes']['Category']);  
                  
                  

                  Was aber (oh wunder, denn NetLook "proggt" ;-)) nicht funktioniert. Ich habe es nochmals und nochmals überprüft und ich meine es müsste korrekt sein.

                  Wenn ich:

                    
                  echo array2table($Result['getCategoryTreeResult']['Nodes']['Category'][0]['Nodes']['Category']);  
                  
                  

                  Funktioniert es, aber ich möchte lieber nach dem Titel gehen, da sich die Position immer mal ändern kann.

                  Wo ist denn der Fehler???

                  Gruß
                  NetLook

                  1. Hi NetLook!

                    echo array2table($Result['getCategoryTreeResult']['Nodes']['Category']['Title']['Brenner & Massenspeicher']'Nodes']['Category']);
                                                                                               Es fehlt ja auch ne Klammer ;-) ^

                    echo array2table($Result['getCategoryTreeResult']['Nodes']['Category']['Title']['Brenner & Massenspeicher']);
                    funktioniert wohl nicht?

                    MfG H☼psel

                    --
                    "It's amazing I won. I was running against peace, prosperity, and incumbency."
                    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
                    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
                    1. Hi!

                      Ne an der Klammer lag es nicht, die war im Code auch gesetzt, ist mir hier beim Eintrag irgendwie entwischt?! So einen Fehler hätte ich dann doch bemerkt ;-)

                        
                      echo array2table($Result['getCategoryTreeResult']['Nodes']['Category']['Title']['Brenner & Massenspeicher']);  
                      
                      

                      Ne, das funktioniert leider nicht!

                      Gruß
                      NetLook

                      1. Hi NetLook!

                        Ne, das funktioniert leider nicht!

                        Kannst du das Array bzw. den Code mal posten?

                        Hast mal du versucht, die Funktion rekursiv aufzurufen?
                        echo array2table($Result['getCategoryTreeResult']['Nodes']['Category']['Title']['Brenner & Massenspeicher'],true);

                        MfG H☼psel

                        --
                        "It's amazing I won. I was running against peace, prosperity, and incumbency."
                        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
                        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
                        1. Hi!

                          Was gibt eigentlich meine Funktion aus?

                          Nichts

                          Ich habe das Array, was aus der XML Datei ensteht mit print_r()
                          ausgegeben und habe es etwas gegliedert. Ich poste aber nur den Anfang, sonst wird es zu viel, das reicht aber auch zur Übersicht (hoffe ich):

                            
                          Array ( [getCategoryTreeResult] =>  
                           Array ( [Records] => 236 [ProgramID] => 3323 [Title] => xxxxxx.de [LogoURL] => [Nodes] =>  
                            Array ( [Category] =>  
                             Array ( [0] =>  
                              Array ( [ID] => 28952094 [ParentID] => 0 [Title] => Apple [Nodes] =>  
                               Array ( [Category] =>  
                                Array ( [0] =>  
                                 Array ( [ID] => 28952095 [ParentID] => 28952094 [Title] => Garantieverlängerung [Nodes] => ) [1] =>  
                                 Array ( [ID] => 28952271 [ParentID] => 28952094 [Title] => iMac [Nodes] => ) [2] =>  
                                 Array ( [ID] => 28952140 [ParentID] => 28952094 [Title] => Mac mini [Nodes] => ) [3] =>  
                                 Array ( [ID] => 29348420 [ParentID] => 28952094 [Title] => Mac Pro [Nodes] => ) [4] =>  
                                 Array ( [ID] => 29053537 [ParentID] => 28952094 [Title] => MacBook [Nodes] => ) [5] =>  
                                 Array ( [ID] => 28975379 [ParentID] => 28952094 [Title] => MacBook Pro [Nodes] =>  
                              )  
                             )  
                             )  
                           )  
                               [1] =>  
                              Array ( [ID] => 28952084 [ParentID] => 0 [Title] => Brenner & Massenspeicher [Nodes] =>  
                               Array ( [Category] =>  
                                Array (  
                                [0] =>  
                                 Array ( [ID] => 28952100 [ParentID] => 28952084 [Title] => CD-Brenner [Nodes] =>  
                                  Array ( [Category] =>  
                                   Array ( [ID] => 28952101 [ParentID] => 28952100 [Title] => Firewire CD [Nodes] =>  
                                   )  
                                  )  
                                 )  
                                [1] =>  
                              Array ( [ID] => 28952200 [ParentID] => 28952084 [Title] => DVD Brenner [Nodes] =>  
                                 Array ( [Category] =>  
                                  Array (  
                                   [0] =>  
                                    Array ( [ID] => 28952235 [ParentID] => 28952200 [Title] => FireWire DVD [Nodes] =>  
                                    )  
                                   [1] =>  
                                    Array ( [ID] => 28952246 [ParentID] => 28952200 [Title] => USB DVD [Nodes] =>  
                                    )  
                                   [2] =>  
                                    Array ( [ID] => 28952234 [ParentID] => 28952200 [Title] => USB/FireWire DVD [Nodes] =>  
                                    )  
                                    )  
                                   )  
                                  )  
                                [2] => ...  
                          
                          

                          Die Funktion rekursiv aufrufen, ähh, ne hab ich nicht, weis jetzt auch nicht wie das gehen soll.

                          Gruß
                          NetLook

                          1. Hi NetLook!

                            Was gibt eigentlich meine Funktion aus?
                            Nichts

                            Das verstehe ich nicht.

                            Ich habe das Array, was aus der XML Datei ensteht mit print_r()
                            ausgegeben und habe es etwas gegliedert. Ich poste aber nur den Anfang, sonst wird es zu viel, das reicht aber auch zur Übersicht (hoffe ich):

                            Ich wollte eigentlich mit dem Array ein paar Test durchführen.

                            Die Funktion rekursiv aufrufen, ähh, ne hab ich nicht, weis jetzt auch nicht wie das gehen soll.

                            Hab ich dir ja geschrieben:
                            echo array2table($Result['getCategoryTreeResult']['Nodes']['Category']['Title']['Brenner & Massenspeicher'],true);

                            MfG H☼psel

                            --
                            "It's amazing I won. I was running against peace, prosperity, and incumbency."
                            George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
                            Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
                            1. Hallo!

                              Das Array verändert sich nicht mehr großartig, es kommen noch weitere Kategorien dazu das ist alles, dafür brauch ich das Megading ja jetzt nicht posten ;-) Ich weis zwar nicht genau, was du testen willst, aber um die richtige Schreibweise für

                                
                              echo array2table($Result['getCategoryTreeResult']['Nodes']['Category']['Title']['Brenner & Massenspeicher'],true);  
                              
                              

                              rauszufinden reicht das Array, ansonsten kann ich es dir mailen?!

                              In deiner Funktion wird es doch eh rekursic aufgerufen!?

                              Gruß
                              NetLook

                              1. Hi NetLook!

                                [...] ansonsten kann ich es dir mailen?!

                                Wenn du möchtest, darfst du das: mailto:xong_@gmx.de

                                MfG H☼psel

                                --
                                "It's amazing I won. I was running against peace, prosperity, and incumbency."
                                George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
                                Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
                      2. Hi NetLook!

                        Was gibt eigentlich meine Funktion aus?
                        echo array2list($Result['getCategoryTreeResult']['Nodes']['Category']['Title']['Brenner & Massenspeicher']);

                        MfG H☼psel

                        --
                        "It's amazing I won. I was running against peace, prosperity, and incumbency."
                        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
                        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)