brauche Webseite ideal für Vereine und Firmen
- Ad -
php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 

 


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!

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 21-06-2009, 11:29
nichtsooft
 Registrierter Benutzer
Links : Onlinestatus : nichtsooft ist offline
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 383
nichtsooft ist zur Zeit noch ein unbeschriebenes Blatt
nichtsooft eine Nachricht über ICQ schicken
Standard 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++; }
Mit Zitat antworten
  #2 (permalink)  
Alt 21-06-2009, 12:18
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Zitat:
Zitat von nichtsooft Beitrag anzeigen
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(...);
Mit Zitat antworten
  #3 (permalink)  
Alt 21-06-2009, 12:25
nichtsooft
 Registrierter Benutzer
Links : Onlinestatus : nichtsooft ist offline
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 383
nichtsooft ist zur Zeit noch ein unbeschriebenes Blatt
nichtsooft eine Nachricht über ICQ schicken
Standard

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++; }
Mit Zitat antworten
  #4 (permalink)  
Alt 21-06-2009, 12:35
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 24.486
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #5 (permalink)  
Alt 21-06-2009, 12:42
nichtsooft
 Registrierter Benutzer
Links : Onlinestatus : nichtsooft ist offline
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 383
nichtsooft ist zur Zeit noch ein unbeschriebenes Blatt
nichtsooft eine Nachricht über ICQ schicken
Standard

Zitat:
Zitat von wahsaga Beitrag anzeigen
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)
Mit Zitat antworten
  #6 (permalink)  
Alt 21-06-2009, 12:44
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 2.925
combie befindet sich auf einem aufstrebenden Ast
Standard

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.
__________________
Wir werden alle sterben

Geändert von combie (21-06-2009 um 12:48 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 21-06-2009, 12:48
nichtsooft
 Registrierter Benutzer
Links : Onlinestatus : nichtsooft ist offline
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 383
nichtsooft ist zur Zeit noch ein unbeschriebenes Blatt
nichtsooft eine Nachricht über ICQ schicken
Standard

Zitat:
Zitat von combie Beitrag anzeigen
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 Beitrag anzeigen
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)
Mit Zitat antworten
  #8 (permalink)  
Alt 21-06-2009, 12:50
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 24.486
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nichtsooft Beitrag anzeigen
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.
Mit Zitat antworten
  #9 (permalink)  
Alt 21-06-2009, 12:59
nichtsooft
 Registrierter Benutzer
Links : Onlinestatus : nichtsooft ist offline
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 383
nichtsooft ist zur Zeit noch ein unbeschriebenes Blatt
nichtsooft eine Nachricht über ICQ schicken
Standard

Zitat:
Zitat von wahsaga Beitrag anzeigen
...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 Beitrag anzeigen
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)
Mit Zitat antworten
  #10 (permalink)  
Alt 21-06-2009, 13:07
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 24.486
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nichtsooft Beitrag anzeigen
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.
Mit Zitat antworten
  #11 (permalink)  
Alt 21-06-2009, 13:13
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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)
Mit Zitat antworten
  #12 (permalink)  
Alt 21-06-2009, 16:05
nichtsooft
 Registrierter Benutzer
Links : Onlinestatus : nichtsooft ist offline
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 383
nichtsooft ist zur Zeit noch ein unbeschriebenes Blatt
nichtsooft eine Nachricht über ICQ schicken
Standard

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)
Mit Zitat antworten
  #13 (permalink)  
Alt 24-06-2009, 08:51
nichtsooft
 Registrierter Benutzer
Links : Onlinestatus : nichtsooft ist offline
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 383
nichtsooft ist zur Zeit noch ein unbeschriebenes Blatt
nichtsooft eine Nachricht über ICQ schicken
Standard

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)
Mit Zitat antworten
  #14 (permalink)  
Alt 24-06-2009, 09:10
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 2.925
combie befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Weder mit array_merge(), ..... bekomme ich ein brauchbares Ergebniss!
Aha!
Und was ist falsch am Ergebnis?
__________________
Wir werden alle sterben
Mit Zitat antworten
  #15 (permalink)  
Alt 24-06-2009, 09:31
nichtsooft
 Registrierter Benutzer
Links : Onlinestatus : nichtsooft ist offline
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 383
nichtsooft ist zur Zeit noch ein unbeschriebenes Blatt
nichtsooft eine Nachricht über ICQ schicken
Standard

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++; }
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Rekursive Funktion die aus eine DB ausliest Milkaa PHP Developer Forum 2 22-11-2006 19:10
[Funktion] Rekursive Funktion - PHP-file download fletschge PHP Developer Forum 4 16-08-2006 17:05
[Funktion] Rekursive Funktion gibt keinen Rückgabewert shihan PHP Developer Forum 7 26-12-2004 01:53
rekursive funktion datenbankabfrage Blutgraf PHP Developer Forum 16 15-11-2004 11:39
[Funktion] Rekursive Darstellung (mal wieder) OliOli PHP Developer Forum 15 11-05-2004 12:00

Themen-Optionen
Thema bewerten
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.

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


PHP News

MariaDB 5.5 veröffentlicht
MariaDB 5.5 veröffentlichtDie freie MySQL-Alternative MariaDB wurde in der stabilen Version 5.5.23 veröffentlicht und soll einige Verbesserungen gegenüber Oracles Communityversion von MySQL mitbringen.

16.04.2012 | Berni

Deutsche Yii Framework Community
Deutsche Yii Framework CommunitySeit dem 19.03.2012 gibt es für die Yii PHP Framework Community ein deutsches Zuhause.

20.03.2012 | dhcomputer

 

Aktuelle PHP Scripte

EM 2012 Tipp-Spiel ansehen EM 2012 Tipp-Spiel

Online Tipp-Spiel zur Fussball Europameisterschaft 2012, basierend auf php-Script mit hinterlegter mySql-Datenbank

27.05.2012 tippimnetz | Kategorie: PHP/ Spiele
Advanced Login ansehen Advanced Login

Login-System und Kundenverwaltung, die sich spielend leicht in bestehende Webseiten einbauen lässt und einen enormen Funktionsumfang bietet. Ihre eigene Webseite muss mit Advanced Login nicht umständlich an ein fertiges System angepasst werden.

25.05.2012 Madden | Kategorie: PHP/ Kundenverwaltung
BROM CMS/BelCal 3 ansehen BROM CMS/BelCal 3

Spezielles CMS für Betreiber von Ferienwohnungen. Komplette Seitenerstellung online, Verwaltung mehrerer Objekte, Reservierungssystem mit sofortigem Abgleich im Belegungskalender und vieles mehr bietet dieses Content Management System.

25.05.2012 belcal2 | Kategorie: PHP/ CMS
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 11:54 Uhr.