Multidimensionale Arrays browsen

Neurodeamon

Erfahrenes Mitglied
Da bin ich wieder mit "Fragen: Teil 3" und meiner unermüdlichen Erkundung der Fähigkeiten von PHP mit Multidimensionalen Arrays. *kotz, 'schuldigung*

Nehmen wir mal mein Array:

PHP:
Array
(
    [Unterordner] => Array
        (
            [0] => folder.gif
            [1] => openfolder.gif
            [2] => shim.gif
        )

    [1] => ndprofile.css
    [2] => template.html
    [3] => list.php
    [Unterordner] => Array
        (
            [Unterunterordner] => Array
                (
                    [Unterunterunterordner] => 
                )

        )

    [5] => info.txt
    [6] => index.php
    [7] => classes.inc.php
)

Wie man (hoffentlich) sieht sind das Ordner und Dateien:
Dateien -> numerisch
Ordner -> assoziativ

Daraus läßt sich mit print_r() eine schöne Verzeichnisstruktur ausgeben. Nicht sehr übersichtlich, oder?
In diesem virtuellen Verzeichnisbaum möchte ich jetzt über den Browser navigieren.

Jetzt ergibt sich mein Problem ... wie kann ich das realisieren?

Die Root-Ebene darzustellen ist nicht weiter wild. Wenn ich jetzt aber in höheren Ebenen gehe stosse ich auf das Problem, das ich die Variablen-Ebenen dynamisch generieren müßte.

Beispiel:
PHP:
// Ordner "Unterordner" im Rootverzeichnis "/"
echo $arr_root["Unterordner"];
// Ordner "Unterunterordner" im Ordner "Unterordner" in "/"
echo $arr_root["Unterordner"]["Unterunterordner"];

Jetzt weiß man natürlich nicht wie tief das Wurzelverzeichnis gehen kann.
Also wäre es dämlich mit selbst vordefinierten ultrakonstrukten wie $arr_bla[$a][$b][$c][$d][$e][$f] zu arbeiten, sondern PHP diese selbst generieren zu lassen:

PHP:
// Rootebene
$arr_bla[$item0]
// 2. Ebene 
$arr_bla[$item0][$item00];
// 3. Ebene
$arr_bla[$item0][$item00][$item000];
$arr_bla[$item1][$item07][$item012];

Ich hoffe mir kann jemand folgen ... ich verwirre mich ja selbst :-)
 
Zuletzt bearbeitet:
Ok, ich versuchs mal wieder :)

Rekursive Funktion:
PHP:
function browseArray( $a_aArray, $a_iSpaces )
{
    foreach( $a_aArray as $sType => $mValue ) {
        echo str_repeat( " ", $a_iSpaces );
        if ( is_array( $mValue ) ) {
            echo $sType."<br>\r\n";
            browseArray( $mValue, $a_iSpace + 4 );
        } else {
            echo $mValue."<br>\r\n";
        }
    }
}

browseArray( $aVerzStruktur, 0 );

hth und vor allem, dass es funktioniert :)
 
Die Funktion ist ja ganz nett =)

... aber .... *

(* nervig, oder?)

... Damit kann man die Struktur auflisten, aber man kann nicht darin "browsen". Sprich: Root-Ebene auflisten und links zu den Unterordnern generieren. Beim klicken auf die Unterordnerlinks wird dieser Unterordner gelistet und wiederum deren Unterordner als links dargestellt und die Dateien gelistet. Also immer nur eine ausgewählte Ebene.
 
Natürlich kann die Funktion das :)
PHP:
function browseArray( $a_aArray, $a_iSpaces )
{
    foreach( $a_aArray as $sType => $mValue ) {
        echo str_repeat( "&nbsp;", $a_iSpaces );
        if ( is_array( $mValue ) ) {
            echo "<a href=\"datei.php?dir=".$sType.">".$sType."</a><br>\r\n";
            browseArray( $mValue, $a_iSpace + 4 );
        } else {
            echo $mValue."<br>\r\n";
        }
    }
}

if (   isset( $_GET['dir'] )
    && isset( $aVerzStruktur[$_GET['dir']] )
    && is_array( $aVerzStruktur[$_GET['dir']] ) ) {
    $aShowArray = $aVerzStruktur[$_GET['dir']];
} else {
    $aShowArray = $aVerzStruktur;
}

browseArray( $aShowArray 0 );

hth :)
 
Kleine Korrektur, falls jemand anders diesen schönen Code-Schnippsel braucht:
PHP:
echo "<a href=\"datei.php?dir=".$sType."\">".$sType."</a><br>\r\n";

Probier den Code doch mal aus. Damit kann ich höchstens in die zweite Ebene kommen. Die dritte Ebene bekäme ich nur über $arr_struktur["ebene1"]["ebene2"]; - die vierte Ebene über $arr_struktur["ebene1"]["ebene2"]["ebene3"];

Verstehst Du was ich meine?
Dein Schnipsel funktioniert z. B. in

"/" und "/unterverz/" aber nicht in "/unterverz/unterunterverz/"

:rolleyes: :-)

P.S.:

HTH = Hope That Helps
// für alle Leser die das nicht kennen *g*
 
So, ich hoffe mal, das funktioniert ;)
PHP:
function getRecIndex( $a_aBrowse, $a_aArray, $a_iPos ) {
    if ( isset( $a_aArray[$a_aBrowse[$a_iPos]] ) ) {
        if ( is_array( $a_aArray[$a_aBrowse[$a_iPos]] ) ) {
            return getRecIndex( $a_aBrowse,
                                $a_aArray[$a_aBrowse[$a_iPos]],
                                $a_iPos + 1 );
        } else {
            return ( $a_iPos > 0 )
                   ?$a_aArray[$a_aBrowse[$a_iPos - 1]]
                   :$a_aArray;
        }
    } else {
        return ( $a_iPos > 0 )?$a_aArray[$a_aBrowse[$a_iPos - 1]]:$a_aArray;
    }
}

function browseArray( $a_aArray, $a_iSpaces, $a_sGet )
{
    foreach( $a_aArray as $sType => $mValue ) {
        echo str_repeat( "&nbsp;", $a_iSpaces );
        if ( is_array( $mValue ) ) {
            $sGet .= ($a_sGet == "")?$sType:"|".$sType;
            echo "<a href=\"datei.php?dir=".$sGet."\">"
                 .$sType."</a><br>\r\n";
            browseArray( $mValue, $a_iSpace + 4, $sGet );
        } else {
            echo $mValue."<br>\r\n";
        }
    }
}

if ( isset( $_GET['dir'] )
    $aToBrowse = explode( "|", $_GET['dir'] )
} else {
    $aToBrowse = array("");
}

browseArray( getRecIndex( $aToBrowse, $aVerzStruktur, 0 ), 0, "" );
 
Zuletzt bearbeitet von einem Moderator:
Mäh, ich glaube bei der nächsten Tuts-Umfrage kreuze ich Anfänger an und nicht Fortgeschrittener. Könntest Du ein wenig Deine Zeilen erklären? Ich glaube das ist so eine Erfahrungsstufe wo ich hinmöchte, aber noch nicht ganz durchblicke.

Nichtsdestotrotz ist da im Code irgendwo der Wurm drin :-)
Obwohl ich den Ansatz verstehe, den Du meinst - blicke ich leider noch nicht ganz durch. Du übergibst die einzelnen Ebenen über die URL, schon klar. Diese sind über "|" getrennt und werden mit dem explode zerstückelt. So etwas in der Form hatte ich mir auch schon gedacht. Es harpert bei einigen Punkten, die ich noch nicht komplett verstehe.

Dein Code - leicht debuggte Fassung (grobe Tippfehler entfernt) ;) :
PHP:
function getRecIndex( $a_aBrowse, $a_aArray, $a_iPos ) {
    if ( isset( $a_aArray[$a_aBrowse[$a_iPos]] ) ) {
        if ( is_array( $a_aArray[$a_aBrowse[$a_iPos]] ) ) {
            return getRecIndex( $a_aBrowse,
                                $a_aArray[$a_aBrowse[$a_iPos]],
                                $a_iPos + 1 );
        } else {
            return ( $a_iPos > 0 )
                   ?$a_aArray[$a_aBrowse[$a_iPos - 1]]
                   :$a_aArray;
        }
    } else {
        return ( $a_iPos > 0 )?$a_aArray[$a_aBrowse[$a_iPos - 1]]:$a_aArray;
    }
}

function browseArray( $a_aArray, $a_iSpaces, $a_sGet )
{
    foreach( $a_aArray as $sType => $mValue ) {
        echo str_repeat( "&nbsp;", $a_iSpaces );
        if ( is_array( $mValue ) ) {
            $sGet .= ($a_sGet == "")?$sType:"|".$sType;
            echo "<a href=\"datei.php?dir=".$sGet."\">"
                 .$sType."</a><br>\r\n";
            browseArray( $mValue, $a_iSpace + 4, $sGet );
        } else {
            echo $mValue."<br>\r\n";
        }
    }
}

if ( isset( $_GET['dir'] )){
    $aToBrowse = explode( "|", $_GET['dir'] );
} else {
    $aToBrowse = array("");
}

browseArray( getRecIndex( $aToBrowse, $aVerzStruktur, 0 ), 0, "" );
 
Lang, kompliziert, aber es geht :)
PHP:
<?php
function putInArray( $a_sDir )
{
	$aTmpArr = array();
	$iHandler = opendir( $a_sDir );
	while( $sFileName = readdir( $iHandler ) ) {
		if ( ($sFileName != ".") && ($sFileName != "..") ) {
	        if ( !is_dir( $a_sDir."/".$sFileName ) ) {
	            $aTmpArr[] = $sFileName;
	        } else {
	            $aTmpArr[$sFileName] = putInArray( $a_sDir."/".$sFileName );
	        }
		}
	}
	closedir( $iHandler );

	return $aTmpArr;
}

function getRecIndex( $a_aBrowse, $a_aArray, $a_iPos ) {
	if ( $a_iPos != count( $a_aBrowse ) ) {
	    if ( $a_aBrowse[$a_iPos] == "" ) {
	        return $a_aArray;
	    } else {
	        if ( isset( $a_aArray[$a_aBrowse[$a_iPos]] ) ) {
                return getRecIndex( $a_aBrowse,
	                                $a_aArray[$a_aBrowse[$a_iPos]],
	                                $a_iPos + 1 );
	        }
	    }
	}

	return $a_aArray;
}

function browseArray( $a_aArray, $a_iSpaces, $a_sGet )
{
    foreach( $a_aArray as $sType => $mValue ) {
        echo str_repeat( "&nbsp;", $a_iSpaces );
        if ( is_array( $mValue ) ) {
            $sGet = $a_sGet.(($a_sGet == "")?$sType:"|".$sType);
            echo "<a href=\"dir.php?dir=".$sGet."\">"
                 .$sType."</a><br>\r\n";
            browseArray( $mValue, $a_iSpaces + 4, $sGet );
        } else {
            echo $mValue."<br>\r\n";
        }
    }
}


$aVerzStruktur = putinArray("..");

if ( isset( $_GET['dir'] )){
    $aToBrowse = explode( "|", $_GET['dir'] );
} else {
    $aToBrowse = array("");
}

echo "<b>Dir: <i>".implode( "/", $aToBrowse )."/</i></b><br><br>";
if ( ( $aToBrowse[0] != "" ) ) {
	$aTmpArr = $aToBrowse;
	unset($aTmpArr[count($aTmpArr)-1]);
	echo "<a href=\"dir.php?dir="
	     .implode( "|", $aTmpArr )."\">Verz. aufw&auml;rz</a><br>\r\n";
}

browseArray( getRecIndex( $aToBrowse, $aVerzStruktur, 0 ),
             0,
			 implode( "|", $aToBrowse ) );
?>
 
Gnaa... ich hasse es.
Genau das ist es.

Irgendwie muss das doch kürzer gehen. *grübel*
Ich glaube jetzt blicke ich durch :-)

War zwar eine schwierige Geburt und auch gar nicht aus produktivem Grund, sondern Wissensdurst ;)

Daaaangescheen!

Merkblatt:

Fabian in mein "Coole-Leute"-Handbuch eintragen :-)
 
Zurück