PHP Funktion Array zurückgeben

chriss_2oo4

Erfahrenes Mitglied
Hi,

ich habe eine Funktion, die mir den Inhalt eines Verzeichnisses rekursiv dursucht und die Struktur in einem Array speichert. Diese Funktion funktioniert auch super, leider ist das zurückgegebene Array leer (count 0). Zum Test habe ich eine foreach-schleife in die funktion eingebaut, dort wird die struktur auch wunderbar ausgegeben.

Code:
  function dir_rekursiv($a_verzeichnis)  { 
		
		if( substr($a_verzeichnis, -1) != '/') {
			$a_verzeichnis = $a_verzeichnis.'/';
		}
		
		if(!is_dir($a_verzeichnis)) {
			return false;
		}
		
		$m_struktur = array();
		$handle =  opendir($a_verzeichnis); 
		
		while ($datei = readdir($handle)) { 
			if ($datei != "." && $datei != "..") { 
				if (is_dir($a_verzeichnis.$datei)) { 
					dir_rekursiv($a_verzeichnis.$datei.'/'); 
				}
				else { 
					$m_struktur[] = $a_verzeichnis.$datei;
					//echo $a_verzeichnis.$datei.'<br />';
				} 
			}
		} 
		
		closedir($handle); 
		
		foreach ($m_struktur as $value) {    
				echo $value."<br />";
		}
		
		return $m_struktur;
	}


Rufe ich die Funktion wie folgt aus und durchlaufe das Array, wird nichts angezeigt weil das Array leer ist.

Code:
                 $test = dir_rekursiv('Teststruktur');
	if($test) {
		foreach ($test as $value) {    
				echo $value."<br />";
		}
	}
	else {
		echo "Verzeichnis existiert nicht!";
	}

Warum funktioniert das nicht?

Beste Grüße
Chriss
 
Du lässt die Unterverzeichnisse ins leere laufen. Du solltest den Aufruf mit den bisherigen Ergebinissen kompinieren.

PHP:
            if (is_dir($a_verzeichnis.$datei)) { 
                $m_struktur = array_merge($m_struktur, dir_rekursiv($a_verzeichnis.$datei.'/')); 
            }
 
Zuletzt bearbeitet:
Hi,

vielen Dank für deine schnelle Antwort. Aber ich versteh nicht ganz was du meinst.
Mein Problem ist einfach, dass ich ein "global erreichbares Array" habe und dieses in einer Funktion füllen möchte.

Innerhalb dieser Funktion kann ich auch auf die hinzugefügten Werte zugreifen. Außerhalb, oder in einer anderen Funktion sind die Werte aber nicht vorhanden.

Kleines Beispiel
Code:
function funcxy()
	{
		for($i=0; $i<3; $i++)
		{
			$testxy[] = $i;
		}
		
		echo "In Funktion: $testxy[2]<br>";
	}
	
	funcxy();
	echo "Ausserhalb Funktion: $testxy[2]<br>";

Ausgabe:

In Funktion: 2
Ausserhalb der Funktion: (nichts)

Wie kann ich ein Array in einer FUnktion befüllen, dass die Werte auch ausßerhalb der Funktion zur Verfügung stehen?

Beste Grüße
Chriss
 
Ich habe mal rasch ien Beispiel zusammengestellt, wo du siehst wir man mit globalen Variablen umgehen kann.
So wir du willst, funktioniert nur func1 und func2:
PHP:
<?php
function func0(){
    $var++;
}

function func1(){
    $GLOBALS['var']++;
}

function func2(){
    global $var;
    $var++;
}

$var = 1;

echo "Inital: {$var}<br />";        // Inital: 1
func0();
echo "after func0: {$var}<br />";   // after func0: 1  
func1();
echo "after func1: {$var}<br />";   // after func1: 2
func2();
echo "after func2: {$var}<br />";   // after func2: 3
?>

Meine obenr erwähnte änderung bewirkt, dass man nicht mit globalen Variablen arbeiten muss.
Die globalen Variablen sind mit Vorsicht zu geniessen. Bei grösserem Code wird es schnell unübersichtlich wo man überal diese Variablen ändert. Ich persönlich brauche sie nur zum auslesen, ändere sie ni innerhalb einer Funktion oder Classe.
 
Zuletzt bearbeitet:
Hi,

vielen Dank für deine Hilfe. Nun habe ich es dank Dir hinbekommen.

So wie du es in deinem zweiten Post beschrieben hast, verstehe ich es schon. Wie du es allerdings in deinem ersten Post gemeint hast, ist mir immer noch schleierhaft.

Beste Grüße!
chriss
 
Ich arbeite nicht gerne mit globalen Variablen

So werte ich jedesmal den Rückgabewert meiner rekursiven Funktion aus.
Hier ein kleines Beispiel

PHP:
<?php
    $var = array(1, array(2,3), 4);
    echo myRecursiveFunc($var);
    // gibt 1234 zurück    

    function myRecursiveFunc($input){
        if (is_array($input)){
            foreach ($input as $value){            
                $result .= myRecursiveFunc($value);
            }
        } else {
            $result = $input;
        }  
        return $result;
    }
?>
 
Zurück