Fehler im Code

Hallo Leute,

Ich versuche mir mit folgendem Code ein dynamisches Menü zu erstellen!
Leider kommt keine Ausgabe. $Text bleibt leer!!??.
Weis jemand wo der Fehler liegt?

LG Fred

$Ebene[2][1][0] = "Muster";
$Ebene[2][1][1] = "Frauke";
$Ebene[2][1][2] = "Test";
$Ebene[2][1][3] = "Louser";
$Ebene[2][1][4] = "Muster";
$Ebene[2][1][5][0] = "Muster2";
$Ebene[2][1][5][1][0] = "Muster3";
$Ebene[2][1][5][2] = "Muster4";
$Ebene[2][1][5][3] = "Muster5";
$Ebene[2][1][6] = "Muster6";

function getLevel($user\_ary, $level = 0)
{ 
 $return = $level;
 foreach ($user\_ary as $user =\> $value)
 {
 $level\_new = getLevel($value, $level + 1);
 if($level\_new \> $return){
 $return = $level\_new;
 if ( $value == 0 ) {
 $Text .= "

if($level_new \n";
}
}
}

}
return $Text;
}

echo "
";

echo getLevel($Ebene[2][1]);

echo „“;

Soll das ein vollständiges PHP-Programm sein? Welche Parameter muss man angeben?
Bei mir kommmt 10 mal folgende Ausschrift:
Warning: Invalid argument supplied for foreach() in /UNIONFS/opt/lampp/htdocs/card0.php on line 16
Das ist die Zeile: foreach ($user_ary as $user => $value)

Hallo

Ich versuche mir mit folgendem Code ein dynamisches Menü zu
erstellen!
Leider kommt keine Ausgabe. $Text bleibt leer!!??.
Weis jemand wo der Fehler liegt?

Du rufst Deine Funktion rekursiv auf, wobei aber beim
ersten Aufruf der Funktion aus der Funktion der erwartete
Parameter user_ary kein Feld, sondern ein String ist.
Daher ist dann das „level“ === NULL (error)
und keine Zahl, die die „Ebene“ kennzeichnet
(und so weiter).

Grüße

CMБ

Hallo

Daher ist dann das „level“ === NULL (error)
und keine Zahl, die die „Ebene“ kennzeichnet
(und so weiter).

Bin da nicht ganz Deiner Meinung.
Setze Mahl vor return $Text in mein script.
Ausserhalb der For Schleife.
echo $Text;

Da gibts ne Ausgabe!

LG Fred

Hallo

Du machst in deinem Code ein paar komische Sachen:

$return = $level;

Die Variable $return brauchst du nicht, verwende in den Vergleichen $level und in der for-Schleife $level_new

$level_new = getLevel($value, $level + 1);

getLevel erwartet als ersten Parameter ein Array, $value enthält aber machmal einen String. Ein is_array() würde sich anbieten.

if($level_new > $return){

$level_new ist die Rückgabe von getLevel(), also ein String. Es macht keinen Sinn, diesen mit dem Integer $return zu vergleichen.

if ( $value == 0 ) {

Ich glaube hier sollte besser is_string($value) stehen.

Gruß, sigterm

Hallo

$return = $level;

Die Variable $return brauchst du nicht, verwende in den
Vergleichen $level und in der for-Schleife $level_new

$level_new = getLevel($value, $level + 1);

getLevel erwartet als ersten Parameter ein Array, $value
enthält aber machmal einen String. Ein is_array() würde sich
anbieten.

Da kann ich dir nicht folgen, zeig mir den code wie du es machen würdest.

if($level_new > $return){

$level_new ist die Rückgabe von getLevel(), also ein String.
Es macht keinen Sinn, diesen mit dem Integer $return zu
vergleichen.

Es macht schon sinn, zum abgleichen ob’s ne neue ebene ist ja oder nein.

if ( $value == 0 ) {

Ich glaube hier sollte besser is_string($value) stehen.

Da geb ich dir recht!

Gruß, Fred

Hallo

getLevel erwartet als ersten Parameter ein Array, $value
enthält aber machmal einen String. Ein is_array() würde sich
anbieten.

Da kann ich dir nicht folgen, zeig mir den code wie du es
machen würdest.

if (is\_array($value))
{
 $level\_new = getLevel($value, $level + 1);
}

$level_new ist die Rückgabe von getLevel(), also ein String.
Es macht keinen Sinn, diesen mit dem Integer $return zu
vergleichen.

Es macht schon sinn, zum abgleichen ob’s ne neue ebene ist ja
oder nein.

Dann hast du dir aber die falschen Variablen rausgesucht. Vielleicht ist ja auch das

return $Text;

falsch und du wolltest eigentlich eine Zahl zurückgeben?

Gruß, sigterm

Hallo,

Wie sollte der code das aus ein Mehrdimensionalen Array wie diesen,

$Ebene[2][1][0] = „Muster“;
$Ebene[2][1][1] = „Frauke“;
$Ebene[2][1][2] = „Test“;
$Ebene[2][1][3] = „Louser“;
$Ebene[2][1][4] = „Muster“;
$Ebene[2][1][5][0] = „Muster2“;
$Ebene[2][1][5][1][0] = „Muster3“;
$Ebene[2][1][5][2] = „Muster4“;
$Ebene[2][1][5][3] = „Muster5“;
$Ebene[2][1][6] = „Muster6“;

eine Baumstruktur ausgeben wird, wie diese?

  • LINK

  • LINK

  • LINK

  • LINK

  • LINK

    • Link

      • Link
    • Link

    • Link

  • LINK

LG Fred

Hallo,

Wie sollte der code das aus ein Mehrdimensionalen Array wie
diesen,

$Ebene[2][1][0] = „Muster“;
$Ebene[2][1][1] = „Frauke“;
$Ebene[2][1][2] = „Test“;
$Ebene[2][1][3] = „Louser“;
$Ebene[2][1][4] = „Muster“;
$Ebene[2][1][5][0] = „Muster2“;
$Ebene[2][1][5][1][0] = „Muster3“;
$Ebene[2][1][5][2] = „Muster4“;
$Ebene[2][1][5][3] = „Muster5“;
$Ebene[2][1][6] = „Muster6“;

eine Baumstruktur ausgeben wird, wie diese?

  • LINK

  • LINK

  • LINK

  • LINK

  • LINK

  • Link

  • Link

  • Link

  • Link

  • LINK

grundsaetzlich so, wie du es am anfang hattest, aber halt in systematisch (eine funktion sollte immer das gleiche zurueckgeben);

pseudocode:

function buildlist($ar) {
$r = "
";
foreach ($ar as item) {
if (is_array($item)) {
$r .= "- " . buildlist($item) . "
"; //anders als in deinem beispiel muessen auch unter-ul in li stehen.
continue;
}
$r .= "- „.$item.“
";
$r .= „“;
return $r;
}

print buildlist( $Ebene[2][1] );

aber das ist ein untaugliches beispiel, weil du noch links fuer deine hrefs brauchst - also deine konfiguration nochmal ganz anders aussehen wird.
weiter wirst du noch active/current/normal stati und unterschiedliche klassen fuer die ebenen wollen …

Hallo,

function buildlist($ar) {
$r = "
";
foreach ($ar as item) {
if (is_array($item)) {
$r .= "- " . buildlist($item) . "
"; //anders als
in deinem beispiel muessen auch unter-ul in li stehen.
continue;
}
$r .= "- „.$item.“
";
$r .= „“;
return $r;
}

print buildlist( $Ebene[2][1] );

Der Code ist super, leider hab ich zwei fragen.

  1. „if (is_array($item))“ da beginnt eine neue ebene, leider bleibt der link für die neue ebene leer.
    Wie kann man das um gehen?

  2. Woran erkennt der script das der Array zu ende ist. um das zusetzen, damit die ebene abgeschloßen wird.

LG fred

Der Code ist super, leider hab ich zwei fragen.

es war pseudocode, ich habe es nochmal lauffaehig gemacht:

function buildlist($ar) {
$r = "
";

foreach ($ar as $item) {
if (is_array($item)) {
$r .= "- " . buildlist($item) . "
";
continue;
}
$r .= "- „.$item.“
";
}

$r .= „“;
return $r;
}

  1. „if (is_array($item))“ da beginnt eine neue ebene, leider
    bleibt der link für die neue ebene leer.
    Wie kann man das um gehen?

richtig programmieren. pseudocode wie gesagt. moeglicherweise hattest du die fehlende klammer falsch gesetzt.

  1. Woran erkennt der script das der Array zu ende ist. um das
    zusetzen, damit die ebene abgeschloßen wird.

die frage verstehe ich nciht. wenn er im mit dem foreach fertig ist, muss er doch als naechstes dass ul schliessen… siehe 1

richtig programmieren. pseudocode wie gesagt. moeglicherweise
hattest du die fehlende klammer falsch gesetzt.

Was würdest sagen wennst bei mir in Linien Bus einsteigst, mich fragst.
„Wie komme ich in die Str. oder Haltestelle!“
Ich dir sage mit den richtigen Bus!.

Wennst mir nicht helfen willst na gut dann eben nicht!!!

Hab’s hin bekommen,

Ergebniss sieht so aus.

function buildlist($ar,$Level = „“) {
foreach ($ar as $item) {
if (is_array($item)) {
$r .= buildlist($item,$Level = „New“);
continue;
}
if ( $Level == „New“ ){
$r .= "-
„.$item.“
";
buildlist($item,$Level = „Old“);
}else{
$r .= "- „.$item.“
";
}
}
if ( $Level == „Old“ ){
$r .= "
";
buildlist($item,$Level = „“);
}else{
$r .= „“;
}
return $r;
}

Danke für den schups in die richtige Richtung.

LG fred

Hab’s hin bekommen,

Ergebniss sieht so aus.

freut mich natuerlich, wenn es dir weitergeholfen hat.

hast du deine eingangsdaten geaendert?
mit den frueher geposteten erzeugt dein code fehler und ungueltiges html. die rekursiven aufrufe in den abfragen "if level== " sind fuer umsonst, weil mit deren rueckgabewerten nichts getan wird und sie keine globalen variablen aendern - was natuerlich gut ist.