| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

21-06-2009, 11:29
|
|
nichtsooft
Registrierter Benutzer
|
|
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 383
|
|
Problem - Rekursive Funktion + return
Ahoii ahoii!!!
Ich hab ein Problem mit einer rekursiven Funktion!
PHP-Code:
function gallist($var, $depth=0, &$cnt=0, $sub=0) { $i = -1; $g_out = array(); FOREACH ($var as $val) { $i++; $rueck = $depth * 16; // Class ändern wenn subgallery IF ($sub != 0) { $class = "norm"; } ELSE { $class = "bold"; } echo "Debug: ".$cnt." - ".$rueck." - ".$val[0]["name"]."<BR>"; //$g_out[$cnt] = array('id' => $val[0]["id"], 'name' => $val[0]["name"], 'depth' => $rueck, 'class' => $class); IF (isset($val["SUB"])) { $cnt++; $anzahl = isset($val["SUB"]) ? count($val["SUB"]) : 0; gallist($val["SUB"], $depth+1, $cnt, $anzahl); } $cnt++; } return $g_out; }
Diese sollte eigentlich ein ARRAY (=$g_out) zurückgeben das verschiedene Werte (mehrdimensional) hat.
Leider bekomme ich aber nur dann etwas zurück, wenn sich die Funktion selbst aufruft, sonst aber nicht!
Kann mal bitte einer einen Blick drauf werfen!?
Die Ausgabe der Funktion kann (inkl. Debug) hier eingesehen werden!
__________________
WHILE (!$asleep) { $sheep++; }
|

21-06-2009, 12:18
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Zitat:
Zitat von nichtsooft
Diese sollte eigentlich ein ARRAY (=$g_out) zurückgeben das verschiedene Werte (mehrdimensional) hat.
|
Kannst du das Präzisieren? Was erwartest du als Rückgabe?
Ansonsten würde ich erstmal raten, die Rückgabe des rekursiven Aufrufs auch entgegen zu nehmen!
$g_out = gallist(...);
|

21-06-2009, 12:25
|
|
nichtsooft
Registrierter Benutzer
|
|
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 383
|
|
Genauere Angaben... Hmm... Nunja;
Ich erwarte mir daß ich ein gesammeltes Array in folgender Form
"Array ([id],[name],[depth],[class])" für alle Galerien und Subgalerien zurück bekomme! -> Es geht also um die auskommentierte Zeile
Leider werden lediglich alle Subgalerien (also die Rückgaben der rekursiven Aufrufe) ins Array eingefügt und alle "normalen" ( != rekursiven) Aufrufe werden übergangen!
Man sieht auf der geposteten Beispielseite sehr gut worum's geht!
__________________
WHILE (!$asleep) { $sheep++; }
|

21-06-2009, 12:35
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Du initialisierst zu Beginn ein Array, gibst es am Ende zurück - und machst dazwischen absolut gar nichts damit, fügst keinen einzigen Wert ein.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

21-06-2009, 12:42
|
|
nichtsooft
Registrierter Benutzer
|
|
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 383
|
|
Zitat:
Zitat von wahsaga
Du initialisierst zu Beginn ein Array, gibst es am Ende zurück - und machst dazwischen absolut gar nichts damit, fügst keinen einzigen Wert ein.
|
Ja, weil die betreffende Zeile hier im geposteten Script auskommentiert ist!
Also nochmal für dich wahsaga:
PHP-Code:
function gallist($var, $depth=0, &$cnt=0, $sub=0) { $i = -1; $g_out = array(); FOREACH ($var as $val) { $i++; $rueck = $depth * 16; // Class ändern wenn subgallery IF ($sub != 0) { $class = "norm"; } ELSE { $class = "bold"; } // DEBUG echo Meldung echo "Debug: ".$cnt." - ".$rueck." - ".$val[0]["name"]."<BR>"; // Array $g_out befüllen $g_out[$cnt] = array('id' => $val[0]["id"], 'name' => $val[0]["name"], 'depth' => $rueck, 'class' => $class); IF (isset($val["SUB"])) { $cnt++; $anzahl = isset($val["SUB"]) ? count($val["SUB"]) : 0; gallist($val["SUB"], $depth+1, $cnt, $anzahl); } $cnt++; } return $g_out; }
Aufruf der Funktion läuft so ab: gallist(get_categories($galari))
Wenn du die get_categories() auch noch gepostet haben willst, gib bescheid...
__________________
WHILE (!$asleep) { $sheep++; }
Geändert von nichtsooft (21-06-2009 um 12:44 Uhr)
|

21-06-2009, 12:44
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
Weiterhin wertest du die Rückgabe des rekursiven Aufrufes nicht aus!
Vermutlich fehlt dort ein Array_merge()
Bisher verstehe ich deine Datentruktur und deine Absicht nicht ganz.
Geändert von combie (21-06-2009 um 12:48 Uhr)
|

21-06-2009, 12:48
|
|
nichtsooft
Registrierter Benutzer
|
|
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 383
|
|
Zitat:
Zitat von combie
Bisher verstehe ich deine Datentruktur und deine Absicht nicht ganz.
|
Es wird ein Array zurückgegeben mit dessen Hilfe ich ein Pulldown-Menü befüllen will! Ich will bloß nicht schon in der Funktion ein echo"<option>...</option>"; drinnen haben, desshalb die Rückgabe des Arrays.
Die Absicht erklärt denk ich die Struktur des Arrays...
Zitat:
Zitat von combie
Weiterhin wertest du die Rückgabe des rekursiven Aufrufes nicht aus!
|
Ist aber interessant, dass ich dann genau dafür Werte im Array hab und bei den nicht rekursiven Aufrufen nicht!
__________________
WHILE (!$asleep) { $sheep++; }
Geändert von nichtsooft (21-06-2009 um 12:51 Uhr)
|

21-06-2009, 12:50
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von nichtsooft
Ja, weil die betreffende Zeile hier im geposteten Script auskommentiert ist! 
|
Ach nee ... die Stelle, an der du da etwas in das Array schreibst, ist aber unsinnig.
Deine Funktion gallist gibt ein Array zurück - und was machst du mit diesem an der Stelle, wo du die Funktion (innerhalb ihrer selbst) aufrufst?
Nichts, Nada, Niente ... du wirfst die Rückgabe einfach weg.
So, wie du das derzeit machst, kannst du nur einen einzigen Eintrag in deinem Array bekommen - den vom Aufruf auf oberster Ebene.
Entweder übergibst du ein Array per reference - dann kannst du auf jeder Ebene neue Einträge machen.
Oder du legst die Rückgabe des Funktionsaufrufes jeweils in einem neuen Array-Element ab - dann bekommst du letztendlich ein mehrdimensionales Array heraus.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

21-06-2009, 12:59
|
|
nichtsooft
Registrierter Benutzer
|
|
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 383
|
|
Zitat:
Zitat von wahsaga
...So, wie du das derzeit machst, kannst du nur einen einzigen Eintrag in deinem Array bekommen - den vom Aufruf auf oberster Ebene.
|
Also ich bekomme abgesehen von den "Debug-Zeilen" folgendes zurück:
[0] Array ( [id] => 56 [name] => Zusätzliches [depth] => 0 [class] => bold )
[1] Array ( [id] => 4 [name] => Schuljahr 2008/2009 [depth] => 0 [class] => bold )
[2] Array ( [id] => 3 [name] => Schuljahr 2007/2008 [depth] => 0 [class] => bold )
[3] Array ( [id] => 2 [name] => Schuljahr 2006/2007 [depth] => 0 [class] => bold )
[4] Array ( [id] => 1 [name] => Schuljahr 2005/2006 [depth] => 0 [class] => bold )
Zitat:
Zitat von wahsaga
Deine Funktion gallist gibt ein Array zurück - und was machst du mit diesem an der Stelle ... du wirfst die Rückgabe einfach weg ... Oder du legst die Rückgabe des Funktionsaufrufes jeweils in einem neuen Array-Element ab - dann bekommst du letztendlich ein mehrdimensionales Array heraus.
|
Nun ich dachte eigenlich dass ich durch die Indizierung $array[$steigender_key][$werte] jeweils ein neues Array-Element schaffe und befülle!?
__________________
WHILE (!$asleep) { $sheep++; }
Geändert von nichtsooft (21-06-2009 um 13:01 Uhr)
|

21-06-2009, 13:07
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von nichtsooft
Also ich bekomme abgesehen von den "Debug-Zeilen" folgendes zurück:
|
Gut, ja - durch die foreach-Schleife bekommst du ggf. mehrere Einträge auf einer Ebene.
Zitat:
Nun ich dachte eigenlich dass ich durch die Indizierung $array[$steigender_key][$werte] jeweils ein neues Array-Element schaffe und befülle!?
|
Ja - auf jeder "Ebene".
Und dein auf der aktuellen Ebene befülltes, neues Array gibst du dann mittels return wieder an die nächsthöhere zurück - und lässt es dort direkt in ein schwarzes Loch fallen.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

21-06-2009, 13:13
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Wie sieht $var aus beim ersten Aufruf aus?
Und räum mal bisschen auf! $i wird nicht benutzt. isset($foo) ist überflüssig in einem If-Block, der nur genau dann betreten wird. Der Parameter $sub leitet sich direkt aus $var ab, kann also weg.
Damit du verstehst was wir meinen, kommentiere mal die Zeile gallist($val["SUB"], $depth+1, $cnt, $anzahl); aus. Wirst sehen, dass du dann genau das selbe zurück bekommst. Danach kommentiere sie mal wieder ein und setze $g_out = davor. Vielleicht klappt es dann schon.
Geändert von onemorenerd (21-06-2009 um 13:18 Uhr)
|

21-06-2009, 16:05
|
|
nichtsooft
Registrierter Benutzer
|
|
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 383
|
|
Ich muss gestehen ihr hattet wie immer recht!
Binaries über mein Haupt!
Wenn mir jetzt noch jmd das Brett vorm Kopf wegnehmen könnte, das verhindert, dass die Struktur im Array gleich bleibt, selbst wenn es sich um nen rekursiven Aufruf handelt, wäre ich sehr verbunden!
Es ist nämlich so, daß rekursive Aufrufe einen Index mehr im Array haben!
PHP-Code:
function gallist($var, $depth=0, &$cnt=0, $sub=0) {
$g_out = array();
FOREACH ($var as $val) {
$rueck = $depth * 16;
// Class ändern wenn subgallery
IF (!isset($val["SUB"])) {
$class = "normal";
} ELSE {
$class = "bold";
}
// Array $g_out befüllen
$g_out[$cnt] = array('key' => $cnt, 'id' => $val[0]["id"], 'name' => $val[0]["name"], 'depth' => $rueck, 'class' => $class);
IF (isset($val["SUB"])) {
$cnt++;
$anzahl = isset($val["SUB"]) ? count($val["SUB"]) : 0;
$g_out[$cnt] = gallist($val["SUB"], $depth+1, $cnt, $anzahl);
}
$cnt++;
}
return $g_out;
}
Normal aufgerufen:
[0] Array ( [id] => 56 [name] => Zusätzliches [depth] => 0 [class] => normal )
Rekursiv aufgerufen:
[1] Array ( [1] => Array ( [id] => 57 [name] => Kreativwerkstatt [depth] => 16 [class] => bold ) [2] => Array ( [id] => 58 [name] => Fitnesscenter [depth] => 16 [class] => bold ) [3] => Array ( [id] => 173 [name] => Diverses [depth] => 16 [class] => bold ) [4] => Array ( [id] => 189 [name] => Logos [depth] => 16 [class] => normal ) [6] => Array ( [5] => Array ( [id] => 193 [name] => © Pfeiffer [depth] => 32 [class] => bold ) ) )
Ich denk mal daß ich da um ein array_merge nicht drum rum komme, oder!?
Edit:
Weder mit array_merge(), noch mit array_push() bekomme ich ein brauchbares Ergebniss!
PLS HELP!
Edit2:
Problem nach wie vor nicht gelöst! Ich hab nach wie vor bei rekursiven Aufrufen eine Dimension mehr im Array....
Bin weiterhin für jede Hilfe dankbar!
__________________
WHILE (!$asleep) { $sheep++; }
Geändert von nichtsooft (22-06-2009 um 14:37 Uhr)
|

24-06-2009, 08:51
|
|
nichtsooft
Registrierter Benutzer
|
|
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 383
|
|
SRY Wegen Doppelpost!
PHP-Code:
function gallist($var, $depth=0, &$cnt=0, $sub=0, $g_out) { $set = 0; FOREACH ($var as $val) { $rueck = $depth * 16; // Class ändern wenn subgallery IF (!isset($val["SUB"])) { $class = "normal"; } ELSE { $class = "bold"; } // Array $g_out befüllen $g_out[$cnt] = array('key' => $cnt, 'id' => $val[0]["id"], 'name' => $val[0]["name"], 'depth' => $rueck, 'class' => $class); IF (isset($val["SUB"])) { $cnt++; //$g_out = array(); $anzahl = isset($val["SUB"]) ? count($val["SUB"]) : 0; $g_out[$cnt] = gallist($val["SUB"], $depth+1, $cnt, $anzahl, $g_out); } ELSE { $set = 1; } IF($set === 1) {return $g_out;}; } return $g_out; }
Ich bin nun so weit, daß ich beim Funktionsaufruf ein Array mitgebe und mit der Funktion selbst versuche es zu befüllen!
Leider klappt das auch nicht!
Wäre bitte jmd so nett und würde mir sagen, wo mein Fehler liegt!? Wahsaga, Peter K., oder einer der Spezialisten!?
__________________
WHILE (!$asleep) { $sheep++; }
Geändert von nichtsooft (24-06-2009 um 09:32 Uhr)
|

24-06-2009, 09:10
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
Zitat:
|
Weder mit array_merge(), ..... bekomme ich ein brauchbares Ergebniss!
|
Aha!
Und was ist falsch am Ergebnis?
|

24-06-2009, 09:31
|
|
nichtsooft
Registrierter Benutzer
|
|
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 383
|
|
Nunja ich will ja ein Array in der Form ('key','id','name','depth','class') und bekomm' mit der aktuellen Form in etwa soetwas zurück:
Array ( [0] => Array ( [key] => 0 [id] => 56 [name] => Zusätzliches [depth] => 0 [class] => bold ) [1] => Array ( [0] => Array ( [key] => 0 [id] => 56 [name] => Zusätzliches [depth] => 0 [class] => bold ) [1] => Array ( [key] => 1 [id] => 57 [name] => Kreativwerkstatt [depth] => 16 [class] => normal ) ) )
Sprich erstens werden nicht alle Werte ins Array geschrieben und zweitens bleibt die Struktur ned erhalten, weil wenn isset($val["SUB"]) wieder eine Dimension mehr in meinem Array drinnen ist als ich wollte!
Was genau bei meinen Versuchen mit "array_merge()" zurückgegeben wurde weiß ich nicht mehr. Da es nicht geklappt hab, hatte ich den Versuch - genau wie auch bei array_push() - verworfen! ^^
__________________
WHILE (!$asleep) { $sheep++; }
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|