Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Rückgabewert einer rekrusiven Funktion

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Rückgabewert einer rekrusiven Funktion

    Hi Leute !

    hab da mal wieder ein kleines Problem wo ich sehr gut euer Wissen gebrauchen kann...

    Erstmal eine kleine Beschreibung:

    Ich habe eine Tabelle in der eine Menüstrktur abgelegt ist. Jeder Punkt kann beliebig viele Unterpunkte haben, jeder unterpunkt kann wieder beliebige Unterpunkte haben usw.

    Die Tabelle sieht so aus:

    uid | pid | menuname


    uid = unique identifier
    pid = parent_id

    Ich habe mir eine Funktion geschrieben, der ich eine uid übergeben kann, und dir mir alle unterpunkte zu dieser Funktion ausgeibt.
    Das ist auch alles wunderbar, num zu meinem Problem:
    Im moment gebe ich in der Funktion selber die Unterpunkte aus - Das ist natürlich nicht so schön, viel lieber wäre es mir wenn die Funktion mir einen Array zurückliefern würde.
    Und genau da ist mein Problem: Dadurch das sich die Funktion immer wieder selber aufruft, gehen meine Werte immer wieder verloren. Die Lösung wäre es, der Funktion selber den Array mit den aktuellen Werten zu übergeben, und die neuen Werte diesen anzufügen. Und genau hieran scheitere ich :/

    Hier die Funktion:

    Code:
    <?	function checkMenuePoints($pid, $rekursiv = 1)
    	{
    		# $pid = ParentID eines Menüounktes, zu dem die Unterpunkte ausgegeben werden sollen
    		# $rekursiv = 0 oder 1; legt fest ob die Unterpunkte rekursiv ausgegeben werden sollen, oder ob nur die direkten
    		# Unterpunkte angezeit werden
    		
    		$SQL = "SELECT uid, pid, name FROM tbl_faqbaum WHERE pid = '$pid';";
    		$rssubmenue = mysql_query($SQL);
    		$margin = $marg;
    	
    		if (mysql_num_rows($rssubmenue) > 0) // Unterpunkte vorhanden, Unterpunkt ausgeben und prüfen ob es weitere Unterpunkte gibt
    		{ 
    		$SQL2 = "SELECT UID FROM tbl_faqbaum WHERE pid='$pid'";
    		$rsuid = mysql_fetch_object(mysql_query($SQL2));
    		#$uid = $rsuid->uid;
    
    			while ($submenue = mysql_fetch_object($rssubmenue)) 
    			{ ?>
    				
    				<? echo stripslashes($submenue->name) ?>
    				
    
    
    				<? 
    
    				if ($rekursiv == 1)
    				{
    					checkMenuePoints($submenue->uid,$rekursiv);	
    				}
    
    			}
    		}
    	}
    ?>
    Das ganze sollte ohne globale variablen funzen...

    ich hoffe ihr könnt mir helfen,
    grüße Ben

  • #2
    if ($rekursiv == 1)
    {
    checkMenuePoints($submenue->uid, $margin, $rekursiv, $test);
    }
    Hier fängst Du den Rückgabewert garnicht auf. Schade, Du könntest ihn gut nutzen.

    Kommentar


    • #3
      Code:
      function yourfunc($data) {
          if (is_array($data)) {
              foreach ($data as $key => $val) {
                  $return[$key] = yourfunc($val);
              }
              return ($return);
          }
          return $data;
      }

      aufbau eines "Loop"

      die umsetzung in dein script sollte wohl nicht mehr so schwer sein

      Kommentar


      • #4
        jo Leute,

        danke schomal für eure Antworten, ich packs leider trotzdem nicht so ganz:

        hier mein aktueller versuch (is zwar noch ohne Array, aber ist ja erstmal egal)

        Code:
        <?	function checkMenuePoints($pid, $rekursiv = 1, $data = "")
        	{			
        		$SQL = "SELECT uid, pid, name FROM tbl_faqbaum WHERE pid = '$pid';";
        		$rssubmenue = mysql_query($SQL);
        	
        		if (mysql_num_rows($rssubmenue) > 0) // Unterpunkte vorhanden, Unterpunkt ausgeben und prüfen ob es weitere Unterpunkte gibt
        		{ 
        
        			$SQL2 = "SELECT uid FROM tbl_faqbaum WHERE pid='$pid'";
        			$rsuid = mysql_fetch_object(mysql_query($SQL2));
        
        			while ($submenue = mysql_fetch_object($rssubmenue)) 
        			{ 
                                        // Übergebener Var. die neuen Werte hinzufügen
        				$data = $data.",".$submenue->uid;
        
        				if ($rekursiv == 1)
        				{
        				// der Funtion die bisher gesammelten Werte übergeben
        					checkMenuePoints($submenue->uid, $rekursiv, $data);
        				}
        			}
        		}
        		return($data); // rückgabe der gesammelten werte
        	}
        ?>
        Aber irgendwo hängt es mit der Übergabe der Werte. ich blick nur leider nicht wo ^^
        Vielen Dank,
        greets ben

        Kommentar


        • #5
          checkMenuePoints($submenue->uid, $rekursiv, $data);
          immer noch keine Verwertung des Rückgabewertes,

          Kommentar


          • #6
            Hi,

            sry Bruchpilot, ich schnall nich so ganz wie du das meinst.

            Ich verwende zwar nich den rückgabewert, aber ich übergebe der Funktion doch die Variable die eigentlich die bisher "gesammelten" Werte enthält.

            Zeige mir doch bitte wie genau die die Verwertung des Rückgabewertes meinst, ich komm echt nich drauf

            thxalot,
            greets ben

            Kommentar


            • #7
              hehe .. jaja diese Ben's ... mfg iss'n Joke

              $reueckgabewert=checkMenuePoints($submenue->uid, $rekursiv, $data);

              Kommentar


              • #8
                Zitat von BennySHS
                Ich verwende zwar nich den rückgabewert, aber ich übergebe der Funktion doch die Variable die eigentlich die bisher "gesammelten" Werte enthält.
                Und die Funktion hängt da was dran und wirft das ganze dann weg, weil Du es nirgendwohin übergibst.
                Variante a) ist, die Return-Werte rekursiv anzunehmen und zusammenzubauen, oder
                b) aus
                function checkMenuePoints($pid, $rekursiv = 1, $data = "")
                sowas zu machen:
                function checkMenuePoints($pid, $rekursiv = 1, &$data)
                damit $data überall die gleiche Variable ist (als Referenz)

                Der erste Aufruf von checkMenuePoints sollte dann aber auch wirklich ne Variable für $data übergeben, sonst meckern v.a. neuere PHP-Versionen, wenns keine Variable gibt, auf die die Referenz zeigen soll.
                mod = master of disaster

                Kommentar

                Lädt...
                X