Array: Unterordner aus übergeordneten Ordnern entfernen

Neurodeamon

Erfahrenes Mitglied
Wen jetzt der Titel verwirrt hat, hier noch einmal eine ausführliche Erklärung. Kürzer und verständlicher kriege ich die Überschrift nicht hin :-)
Ich arbeite an einer Klasse die ein array als input hat. In diesem Array befinden sich Verzeichnisspfade. Aus dem Array möchte ich nun alle Verzeichnisse entfernen die sich in übergeordneten Verzeichnissen befinden.
Beispiel:
PHP:
<?php
$arr_verzeichnisse = array("/verzeichnis1/","/verzeichnis2/","/verzeichnis1/subverzeichnis1/");
?>
Hier müsste also /verzeichnis1/subverzeichnis1/ entfernt werden, weil innerhalb von /verzeichnis1/, welches sich bereits im Array befindet.

Da man ab und zu den Wald vor lauter Bäumen nicht sieht, wenn man zu lange vor einem Problem sitzt würde ich mich über Ideen/Vorschläge, Korrekturen etc. freuen.
Es folgt der bereits vorhandene Code.
Momentan werden nämlich nicht alle einmalig vorkommenden Verzeichnisse ins Ausgabe-Array geschrieben.

PHP:
<?php
class remove_subdir {
	var $clean;
	// remove subdirectories and its files of the same superior directory, as it is stupid to add them
	function remove_subdir($stupid,$type){
        if($type == "dirs"){
            $stupid_tmp = $stupid;
            // create all possible combinations
            foreach($stupid as $dc){
                foreach($stupid_tmp as $dc_tmp){
                    if ($dc != $dc_tmp){
                        $temp1 = strlen($dc);
                        $temp2 = strlen($dc_tmp);
                        if($temp1>$temp2){
                            /* cut the longer string down to size of shorter string
                               to avoid false positives */
                            $dc2 = substr($dc, 0, $temp2);
                            if($dc2 != $dc_tmp){
                                $this->clean[] = $dc_tmp;
                            }
                        }elseif($temp2>$temp1){
                            /* cut the longer string down to size of shorter string
                               to avoid false positives */
                            $dc_tmp2 = substr($dc_tmp, 0, $temp1);
                            if($dc_tmp2 != $dc){
                                $this->clean[] = $dc;
                            }
                        }
                    }
                }
            }
        }elseif($type == "files"){
            //
        }
        $this->clean = array_unique($this->clean);
        return $this->clean;
	}
}

$testarr = array("/6/","/1/2/","/1/3/","/4/6/","/6/7/","/8/","/9/","/1/");

$schwupps = new remove_subdir($testarr,"dirs");
print_r($schwupps->clean);
?>
 
ich würde das so versuchen:

PHP:
foreach($stupid as $dc){ 
                foreach($stupid_tmp as $dc_tmp){
                    if (strpos($dc, $dc_tmp) == 0) { // wenn $dc_tmp an Position 0 (also ganz links) innerhalb $dc steht
                            $this->clean[] = $dc;
                    }
 
Super... mal wieder selbst mein Problem gelöst ... doof ... :rolleyes:
War meine Frage so wirr gestellt? =)


PHP:
<?php
class remove_subdir {
	var $clean;
	// remove subdirectories and its files of the same superior directory, as it is stupid to add them
	function remove_subdir($stupid,$type){
	    $clean_tmp = $stupid; // we need a copy of input array
        if($type == "dirs"){
            // create all possible combinations
            for($i=0;$i<count($stupid);$i++){
                for($j=0;$j<count($stupid);$j++){
                    $length1 = strlen($stupid[$i]);
                    $length2 = strlen($stupid[$j]);
                    if($stupid[$i]!= $stupid[$j]){
                        if($length1>$length2){
                            $stupid_icut = substr($stupid[$i], 0, $length2);
                            if($stupid_icut == $stupid[$j]){
                                $tocut[] = $stupid[$i];
                            }
                        }elseif($length2>$length1){
                            $stupid_jcut = substr($stupid[$j], 0, $length1);
                            if($stupid_jcut == $stupid[$i]){
                                $tocut[] = $stupid[$j];
                            }
                        }elseif($length1 == $length2){
                            if($stupid[$i] == $stupid[$j]){
                                $tocut[] = $stupid[$i];
                            }
                        }
                    }
                }
            }
        }elseif($type == "files"){
            // planned for later use
        }
        $tocut = array_unique($tocut);
        for($x=0;$x<count($clean_tmp);$x++){
            for($y=0;$y<count($tocut);$y++){
                if($clean_tmp[$x] == $tocut[$y]){
                    unset($clean_tmp[$x]);
                }
            }
        }
        natsort($clean_tmp);
        $cleancount = 0;
        foreach($clean_tmp as $cleanone){
            $cleaned[$cleancount] = $cleanone;
            $cleancount++;
        }
        $this->clean = $cleaned;
        return $this->clean;
	}
}

$testarr = array("/6/","/1/2/","/1/3/","/4/6/","/6/7/","/8/","/9/","/1/");
// entferne /6/7/ - /1/2/ - /1/3/

$schwupps = new remove_subdir($testarr,"dirs");
print_r($schwupps->clean);
?>
Ergebnis:
Code:
Array
(
    [0] => /1/
    [1] => /4/6/
    [2] => /6/
    [3] => /8/
    [4] => /9/
)
 
Zurück