kostenloser Webspace werbefrei: lima-city


Verzeichnis-Struktur in Array ablegen ?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    incdesign

    incdesign hat kostenlosen Webspace.

    Hallo

    Ich habe eine Verzeichnis-Struktur wie z.B:
    (Order gekennzeichnet durch » davor)

    » /
        _old_index.html
        dirinfo1.php
        index.php
        test1.php
        » testdir1/
            test2.php
            test3.php
            » testdir2/
                test4.php
                » testdir4/
                    test6.php
                    test7.php
        » testdir3/
            test5.php
    ...


    jetzt möchte ich diese Struktur in ein multidimensionales Array ablegen
    also so, dass wenn Ordner, dann dessen Inhalte als Sub-Array

    ich habe eine Funktion, die mir zwar die Verzeichnis-Struktur einliest,
    aber nur in ein ein-dimensionales Array mit key = vollständiger Verzeichnis-Pfad

    <?php 
    // -------------------------------------------------- 
    
    function listFolder($dir, $level=1, $dirdata=array()) { 
    
    	$exclude = array('.htaccess', 'geheim.php'); 
    
    	$ffsx = scandir($dir);
    
    	foreach($ffsx as $ff){
    		if(is_array($exclude) and !in_array($ff,$exclude)){
    			if($ff != '.' && $ff != '..') {
    				if(!is_dir($dir.'/'.$ff)){ 
    					$godir = ltrim($dir,'./'); 
    					
    					if ($level == 1) { $dirdata['home'][] = $godir.'/'.$ff; }
    								else { $dirdata[$godir][] = $godir.'/'.$ff; } 
    					
    				} else {
    					$level++; 
    					$dirdata = listFolder($dir.'/'.$ff, $level, $dirdata); 
    					$level--;
    				} 
    			} 
    		}
    	}
    
    	return $dirdata; 
    } 
    
    // -------------------------------------------------- 
    
    $path = '.'; 
    
    $dirinfo = listFolder($path); 
    
    // -------------------------------------------------- 
    
    print "<pre style=\"margin:4px; padding:6px; background:#DEDEDE; text-align:left;\">\n"; 
    print_r($dirinfo); 
    print "</pre>\n";
    
    // -------------------------------------------------- 
    ?>


    die Ausgabe davon ist:

    Array
    (
        [home] => Array
            (
                [0] => /_old_index.html
                [1] => /dirinfo1.php
                [2] => /index.php
                [3] => /test1.php
            )
    
        [testdir1] => Array
            (
                [0] => testdir1/test2.php
                [1] => testdir1/test3.php
            )
    
        [testdir1/testdir2] => Array
            (
                [0] => testdir1/testdir2/test4.php
            )
    
        [testdir1/testdir2/testdir4] => Array
            (
                [0] => testdir1/testdir2/testdir4/test6.php
                [1] => testdir1/testdir2/testdir4/test7.php
            )
    
        [testdir3] => Array
            (
                [0] => testdir3/test5.php
            )
    
    )



    ich hätte aber gerne ein mehrdimensionales Array, das die Struktur in den Array-Ebenen abbildet,
    ich komme aber nicht drauf, wie ich das machen soll ...

    ... irgendwie mit
    $dirparts = explode('/',$godir);
    ... Struktur aufdröseln, ... aber dann ?!?


    Das Ergebnis soll in Etwa so aussehen:

    Array
    (
     [home] => Array 
    	(
    	[0] => _old_index.html
    	[1] => dirinfo1.php
    	[2] => index.php
    	[3] => test1.php
    	[testdir1] => Array 
    		(
    		[0] => test2.php
    		[1] => test3.php
    		[testdir2] => Array 
    			(
    			[0] => test4.php
    			[testdir4] => Array 
    				(
    				[0] => test6.php
    				[1] => test7.php
    				)
    			)
    		)
    	[testdir3] => Array 
    		(
    		[0] => test5.php
    		)
    	)
    )


    so oder auch ähnlich,
    hauptsache die Struktur der Verzeichnisse wird im Array als Ebenen abgebildet.


    ich hoffe da kann mir jemand dabei helfen,
    wie ich aus der Verzeichnis-Struktur ein multidimensionalen Array erstellen kann ... ?

    Danke!

  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Meinst du in etwa so etwas?
    <?php
    
    header('content-type: text/plain; charset=utf-8');
    
    function listFiles($dir) {
    	$exclude = array('.htaccess', 'geheim.php');
    	$files = scandir($dir);
    	$result = array();
    	foreach($files as $file) {
    		if(is_array($exclude) && in_array($file, $exclude))
    			continue;
    		if(($file == '.') || ($file == '..'))
    			continue;
    		if(is_dir("$dir/$file")) { // directory
    			$result[$file] = listFiles("$dir/$file");
    		} else { // file
    			$stat = stat("$dir/$file");
    			$result[$file] = $stat['size'];
    		}
    	}
    	return $result;
    }
    
    function simpleTree($tree, $name = '', $level = 0) {
    	$indent = str_repeat(' ', $level * 4);
    	$dir = is_array($tree) ? '» ' : '';
    	$name .= is_array($tree) ? '/' : " ($tree)";
    	echo("$indent$dir$name\n");
    	if(is_array($tree))
    		foreach($tree as $file => $info)
    			simpleTree($info, $file, $level + 1);
    }
    
    echo("print_r:\n");
    print_r(listFiles('.'));
    
    echo("\nsimple tree:\n");
    simpleTree(listFiles('.'));


    Beitrag zuletzt geändert: 6.4.2013 15:59:22 von hackyourlife
  4. Autor dieses Themas

    incdesign

    incdesign hat kostenlosen Webspace.

    ja Super, Danke

    eigentlich ja ganz einfach, ich stand nur irgendwie auf dem Sclauch
    hatte die Vorgehensweise ja eigentlich schon
    incdesign schrieb:
    ... wenn Ordner, dann dessen Inhalte als Sub-Array ...


    aber ich bin da viel zu kompliziert dran gegenagen
    also einfach direkt das umsetzen ... wenn Ordner, dann als Array ... :)

    ... sowas nennt man dann doch: "rekrisiver Funktionsaufruf" ?!

    Jetzt bin ich aber noch drauf gekommen, das es evtl. doch nicht so gut ist,
    wenn die Ordner-/Datei- Namen als KEY im Array stehen,

    also besser wäre wohl eine Struktur, die keine "Werte" als KEY hat.
    sonden nur "nummeriche" Keys (int) .... aber das ist auch nicht ohne .. oO
    ... einfach Ebene als Key nehmen geht nicht,
    weil ja pro Ebene auch mehrere Unterordner drin sein können


  5. <?php
    function dirTree($pattern = '*', $flags = 0, $path = false, $depth = 0, $level = 0) {
        $tree = array();
        
        $files = glob($path . $pattern, $flags);
        $paths = glob($path . '*', GLOB_ONLYDIR|GLOB_NOSORT);
        
        if (!empty($paths) && ($level < $depth || $depth == -1)) {
            $level++;
            
            foreach ($paths as $sub_path) {
                $tree[] = dirTree($pattern, $flags, $sub_path . DIRECTORY_SEPARATOR, $depth, $level);
            }
        }
    
        $tree = array_merge($tree, $files);
    
        return $tree;
    }
    
    $tree = dirTree('*.*', 0, '.', -1);
    
    echo '<pre>';
    print_r($tree);
    echo '</pre>';
    ?>


    Beitrag zuletzt geändert: 7.4.2013 13:30:47 von fabo
  6. Autor dieses Themas

    incdesign

    incdesign hat kostenlosen Webspace.

    Danke ... gute Idee mit glob()
    ... aber nur fast ... :)

    wenn ein Ordner leer ist (keine Dateien drin) dann ist $files kein Array

    Fehlermeldung:
    Warning: array_merge() .... Argument #2 is not an array ...


    also noch mit Erweiterung um die Kleinigkeit:

    if (!$files) { $files = array(); }  // --------- diese Zeile ist neu 
    $tree = array_merge($tree, $files);


    dann bekommt man leere Verzeichnisse als leeres Array ohne Fehlermeldung.
  7. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Alternativ könntest du auch sowas machen:
    <?php
    
    header('content-type: text/plain; charset=utf-8');
    
    function listFiles($dir) {
    	$exclude = array('.htaccess', 'geheim.php');
    	$files = scandir($dir);
    	$result = array();
    	foreach($files as $file) {
    		if(is_array($exclude) && in_array($file, $exclude))
    			continue;
    		if(($file == '.') || ($file == '..'))
    			continue;
    		if(is_dir("$dir/$file")) { // directory
    			$result[] = (object) array(
    				'name'	=> $file,
    				'files'	=> listFiles("$dir/$file")
    			);
    		} else { // file
    			$result[] = $file;
    		}
    	}
    	return $result;
    }
    
    function simpleTree($tree, $level = 0) {
    	$indent = str_repeat(' ', $level * 4);
    	if(is_array($tree)) { // root node
    		$dir = '» ';
    		$name = '/';
    	} else {
    		$dir = is_object($tree) ? '» ' : '';
    		$name = is_object($tree) ? "{$tree->name}/" : $tree;
    	}
    	echo("$indent$dir$name\n");
    	if(is_object($tree))
    		$tree = $tree->files;
    	if(is_array($tree))
    		foreach($tree as $file)
    			simpleTree($file, $level + 1);
    }
    
    echo("print_r:\n");
    print_r(listFiles('.'));
    
    echo("simpleTree:\n");
    echo(simpleTree(listFiles('.')));
    Die Variante mit dem assoziativen Array war aber einfacher, auch verstehe ich den Grund nicht, warum sie nicht »so gut« sein sollte…

    Bei fabos Variante bekommst du übrigens nur Dateien und keine Ordner (außer indirekt durch den Dateinamen) … ob du das willst?
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!