php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2009

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 25.08.2009, 17:26  
Neuer Benutzer
 
Registriert seit: 25.08.2009
Beiträge: 7
PHP-Kenntnisse:
Anfänger
kristina befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Mehrdimensionales Array als verschachtelte Liste ausgeben mit foreach

Hallo,
ich hänge nun schon länger an einem Problem und hoffe, dass mir hier jemand helfen kann. Ich weiß, dass es hier ähnliche Einträge gibt, aber ich habs nicht geschafft, das auf mein Problem zu übertragen. Ich bin noch ein PHP-Anfänger.
Ich habe ein mehrdimensionales Array, das ich gerne als entsprechende Liste (<ul>) darstellen möchte.
PHP-Code:
SimpleXMLElement Object
(
    [
CategoryType] => SimpleXMLElement Object
        
(
            [@
attributes] => Array
                (
                    [
name] => genre
                
)

            [
Category] => Array
                (
                    [
0] => SimpleXMLElement Object
                        
(
                            [@
attributes] => Array
                                (
                                    [
rating] => -1
                                    
[id] => 7318639
                                    
[name] => Blues
                                    
[videoCount] => 0
                                    
[artistCount] => 134
                                    
[releaseCount] => 2098
                                    
[trackCount] => 27200
                                    
[hasVideoStation] => 0
                                    
[hasAudioStation] => 0
                                
)

                            [
Category] => Array
                                (
                                    [
0] => SimpleXMLElement Object
                                        
(
                                            [@
attributes] => Array
                                                (
                                                    [
rating] => -1
                                                    
[id] => 7318815
                                                    
[name] => Acoustic Blues 
                                                    
[videoCount] => 0
                                                    
[artistCount] => 34
                                                    
[releaseCount] => 611
                                                    
[trackCount] => 8072
                                                    
[hasVideoStation] => 0
                                                    
[hasAudioStation] => 0
                                                
)

                                        )

                                    [
1] => SimpleXMLElement Object
                                        
(
                                            [@
attributes] => Array
                                                (
                                                    [
rating] => -1
                                                    
[id] => 7318681
                                                    
[name] => Blues-Rock 
                                                    
[videoCount] => 0
                                                    
[artistCount] => 43
                                                    
[releaseCount] => 700
                                                    
[trackCount] => 8311
                                                    
[hasVideoStation] => 0
                                                    
[hasAudioStation] => 0
                                                
)
                                           )
                                       )
                                    )

                    [
1] => SimpleXMLElement Object
                        
(
                            [@
attributes] => Array
                                (
                                    [
rating] => -1
                                    
[id] => 7318827
                                    
[name] => Comedy 
                                    
[videoCount] => 0
                                    
[artistCount] => 299
                                    
[releaseCount] => 496
                                    
[trackCount] => 6849
                                    
[hasVideoStation] => 0
                                    
[hasAudioStation] => 0
                                
)

                            [
Category] => Array
                                (
                                    [
0] => SimpleXMLElement Object
                                        
(
                                            [@
attributes] => Array
                                                (
                                                    [
rating] => -1
                                                    
[id] => 7318828
                                                    
[name] => Country Comedy 
                                                    
[videoCount] => 0
                                                    
[artistCount] => 27
                                                    
[releaseCount] => 190
                                                    
[trackCount] => 2177
                                                    
[hasVideoStation] => 0
                                                    
[hasAudioStation] => 0
                                                
)

                                        ) 
Ich will nun so eine Liste ausgeben mit Genrenamen und ihren jeweiligen Untergenres:
  • Blues
    Acoustic Blues
    Blues-Rock
  • Comedy
    Country Comedy


Das funktioniert soweit auch, nur bekomme ich immer zu viele bzw. nicht geschlossene <ul>-Tags. Ich habe nun einiges über Rekursion und is_array gelesen und versucht, aber irgendwie bekomme ich es einfach nicht hin. Hier ist mal der Code, der die Liste ausgibt:

PHP-Code:
     echo "<ul>";
                  foreach (
$genre as $kategorie) {
                      foreach (
$kategorie as $kat) {
                          echo 
"<li>".$kat->attributes()->name."</li>";
                          
                         foreach (
$kat as $variable) {
                         
                          if (
$variable->attributes()->name != '' ){
                                  echo 
"<ul>";}
                          
                             echo 
"<li>".$variable->attributes()->name.</li></ul>";
                                             }
                  }echo "
</ul>";
                 } 
Ich hoffe das ist verständlich beschrieben.
Ich würde mich sehr freuen, wenn mir jemand helfen kann.
Danke schon mal,
Kristina
kristina ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 25.08.2009, 17:33  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

Puh... formatier erstmal deinen Code (2. Codebox) und dann seh ich mit einem Auge, dass da ein " fehlt.
Asipak ist offline  
Alt 25.08.2009, 17:49  
Neuer Benutzer
 
Registriert seit: 25.08.2009
Beiträge: 7
PHP-Kenntnisse:
Anfänger
kristina befindet sich auf einem aufstrebenden Ast
Standard

danke für die schnelle Antwort.
Das Anführungszeichen hab ich wohl beim Versuch, es zu formatieren rausgeslöscht. War aber drin. Der Code funktioniert ja, produziert nur zuviele <ul>s.
HTML-Code:
<ul><li >Blues</li>
<ul><li>Acoustic Blues </li></ul>
<ul><li>Blues-Rock </li></ul>
<li>Comedy </li>
<ul><li>Country Comedy </li></ul> 
Ich hätte gerne die Unterpunkte als einzelne Liste, damit ich sie dann mit Javascript ein- und ausblenden kann.
Hier nochmal der Code, hab versucht ihn zu formatieren
PHP-Code:
   echo "<ul>";
       foreach (
$genre as $kategorie) {
                       
              foreach (
$kategorie as $kat) {
                 echo 
"<li>".$kat->attributes()->name."</li>\n";

                    foreach (
$kat as $variable) {
                         if (
$variable->attributes()->name != '' ){
                                echo 
"<ul>";}
                         echo 
"<li>".$variable->attributes()->name."</li></ul>\n";
                        }
               }echo 
"</ul>";
      } 
kristina ist offline  
Alt 25.08.2009, 17:57  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

Die Formatierung, die du jetzt drin hast, sagt auch nichts aus! Wie wäre es hiermit:

PHP-Code:
echo "<ul>";
foreach (
$genre as $kategorie
{
  foreach (
$kategorie as $kat
  {
    echo 
"<li>".$kat->attributes()->name."</li>\n";
    foreach (
$kat as $variable
    {
      if (
$variable->attributes()->name != '')
      {
        echo 
"<ul>";
      }
      
// auch komisch: </ul> immer schließen, 
      // aber nur bei $variable->attributes()->name != '' öffnen
      
echo "<li>".$variable->attributes()->name."</li></ul>\n"
    }
  }
  echo 
"</ul>";

Die <ul> - Tags befinden sich einfach im falschen Codeblock (foreach - bzw. if - Block).

Du öffnest beispielsweise außerhalb der foreach-Schleife und schließt mit jedem Schleifendruchgang innerhalb! Das kann ja nicht gutgehen.
Asipak ist offline  
Alt 25.08.2009, 18:18  
Neuer Benutzer
 
Registriert seit: 25.08.2009
Beiträge: 7
PHP-Kenntnisse:
Anfänger
kristina befindet sich auf einem aufstrebenden Ast
Standard

so einfach wärs gewesen! ich bin schon ganz verwirrt...
vielen vielen Dank für deine Hilfe!
kristina ist offline  
Alt 26.08.2009, 14:27  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Das scheint mir noch nicht richtig zu sein. Öffnendes und schließendes <ul> gehören imho immer auf die gleiche strukturelle Stufe. Die Lösung ist auch keine Rekusion, klappt also nur für 2 Dimensionen.

[edit]
Jetzt kapiere ich erst, dass er nur Deine Formatierung angepasst hat.
Zitat:
so einfach wärs gewesen! ich bin schon ganz verwirrt...
vielen vielen Dank für deine Hilfe!
hat mich ganz verwirrt.



Grundlage der Rekursion:

Code:
Für alle Elemente des aktuellen Knoten:
  öffnendes umschließendes Element

  Wenn Knoten == Endknoten
    Ausgabe
  Sonst
    Selbstaufruf mit Knoten

  schließendes umschließendes Element
Je nachdem, was das Aussenelement umschließt, variiert dessen Position

Bsp.

PHP-Code:
<?php
$items 
= array (
               
'a' ,
               
'b' ,
               array (
'b1' 
                      
'b2' 
                      array (
'b2.1')
                     ) ,
               
'c'
               
);


function 
outer ($items)
  {
  echo 
'<span>';
  if (
false == is_array ($items))
    {
    echo 
$items;
    }
  else
    {
    foreach (
$items as $item// kürzer ginge es mit array_map
      
{
      
outer ($item);
      }
    }
  echo 
'</span>';
  }

outer ($items);


/*

ergibt eine verschachtelte Struktur (nachträglich formatiert)

<span>
  <span>a</span>
  <span>b</span>
  <span>
    <span>b1</span>
    <span>b2</span>
    <span>
      <span>b2.1</span>
    </span>
  </span>
  <span>c</span>
</span>

*/


function inner ($items)
  {
  if (
false == is_array ($items))
    {
    echo 
'<span>';
    echo 
$items;
    echo 
'</span>';
    }
  else
    {
    foreach (
$items as $item// kürzer ginge es mit array_map
      
{
      
inner ($item);
      }
    }
  }


inner ($items);

/*

ergibt eine lineare Struktur 


<span>a</span>
<span>b</span>
<span>b1</span>
<span>b2</span>
<span>b2.1</span>
<span>c</span>

Listen sind eine Mischung aus linearen und verschachtelten Strukturen

*/

function ulstyle ($items)
  {
  if (
false == is_array ($items))
    {
    echo 
'<li>';
    echo 
$items;
    echo 
'</li>';
    }
  else
    {
    echo 
'<ul>';
    foreach (
$items as $item// kürzer ginge es mit array_map
      
{
      
ulstyle ($item);
      }
    echo 
'</ul>';
    }
  }

echo 
'<ul>';
ulstyle ($items);
echo 
'</ul>';

/* ul/li-Strukturen sind imho nicht vollständig rein rekursiv abbildbar. 
Mit einem kleinen Kniff, gehts aber auch komplett in der Funktion. Ein
Flag (Initialparameter) markiert das äußere Element: */


function fullulstyle ($items $first 1)
  {
  if (
false == is_array ($items))
    {
    
$return '<li>' $items '</li>';
    }
  else
    {
    
$return '<ul>';
    foreach (
$items as $item// kürzer ginge es mit array_map
      
{
      
$return .= fullulstyle ($item 0);
      }
    
$return .= '</ul>';
    }
    
  if (
$first)
    {
    
$return '<ul>' $return '</ul>';
    }

  return (
$return);
  }

echo 
fullulstyle ($items);

/* Voila.  */
PS: Returnwerte wie im letzten Beispiel sind imho näher am eigentlichen Prinzip der Rekursion.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (26.08.2009 um 14:32 Uhr).
nikosch ist gerade online  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
merge Array? tommy_725 PHP Tipps 2009 3 07.08.2009 18:30
[Erledigt] Tabellen die sich selbst referenzieren Squall PHP Tipps 2009 19 04.08.2009 21:33
[Erledigt] Teil eines Array ausgeben tomateundgurke PHP Tipps 2009 6 17.02.2009 14:18
Highscoreliste - Array sortieren und ausgeben archipage PHP Tipps 2009 7 11.01.2009 13:15
[Erledigt] Fehler bei array ausgeben Ind3X PHP Tipps 2008 6 24.12.2008 22:55
Mehrdimensionalen Array in UL ausgeben kipperlenny PHP-Fortgeschrittene 11 07.08.2008 14:33
Soapfault: Undefined Property Argi PHP-Fortgeschrittene 0 28.07.2008 11:17
Eindimensionales Array ohne index per foreach erstellen phpbeginner PHP Tipps 2008 4 10.03.2008 14:18
verschachtelte Rubriken ausgeben / alle anzeigen prinzli PHP Tipps 2008 3 25.02.2008 22:37
textdatei(tab getrennt) in array ausgeben schnurzli PHP Tipps 2006 7 10.10.2006 22:01
array richtig sortieren, dann ausgeben Heart PHP Tipps 2006 5 28.04.2006 20:23
Array ausgeben PHP Tipps 2005-2 1 14.07.2005 12:53
Sortieren von Arrays mit mehr als 2 Dimensionen (Teil 2) Buhmann PHP-Fortgeschrittene 4 12.07.2005 14:03
Array: Nur einen bestimmten Teil ausgeben PHP Tipps 2004 17 25.10.2004 14:29
bbcode - Classe PHP-Fortgeschrittene 4 18.09.2004 17:30

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
javascript mehrdimensionales array ausgeben, http://www.php.de/php-einsteiger/58416-erledigt-mehrdimensionales-array-als-verschachtelte-liste-ausgeben-mit-foreach.html, mehrdimensionales array ausgeben, java verschachtelte listen, php liste ausgeben, php foreach mehrdimensionales array, c mehrdimensionale liste, verschachtelte foreach, php array ausgeben foreach, php mehrdimensionales array foreach, foreach array mehrdimensional, foreach mehrdimensionales array java, java foreach zweidimensional, c 2 dimensionales array ausgeben, php verschachtelte listen, php array in array ausgeben, java for each mehrdimensionales array, foreach mehrdimensionales array, java foreach mehrdimensionales array, zweidimensionales array ausgeben java

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:49 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum