bug in php??!
-
Hallo,
ich bin neu in php aber bei folgendem code find ich den fehler beim besten willen nicht! Die funktion soll ein verzeichnis auslesen und den inhalt rekursiv in ein array schreiben.... dass das sehr speicherintensiv is, is mir klar, also nich meckern, is nur zu testzwecken!
function fs_ls_recursive( $path, &$array ) { $count_array_element = 0; if( ( $handle = opendir( $path ) ) ) { while( false !== ( $name = readdir( $handle ) ) ) { if( ( $name != "." ) && ( $name != ".." ) ) { $pathname = $path."/".$name; if( is_dir( getcwd( )."/".$pathname ) ) { $array[ ] = array( "$pathname" ); fs_ls_recursive( $pathname, $array[ $count_array_element ] ); } else { $array[ ] = "$pathname"; } $count_array_element ++; } } closedir( $handle ); } }
php spuckt folgendes aus:
"PHP Fatal error: [] operator not supported for strings in fs.php"Ich kann mir das beim besten willen nich erklären.... Jemand ne Ahnung?
cu
-
achja, ich hab irgendwo was gelesen, dass das ein bug in php sein soll (google) aber da stand nirgends, wie man den umgeht....
-
verdammt, nochwas vergessen: der fehler tritt laut php in der zeile auf: "array[ ] = "pathname";"
-
Würd sagen lass die " weg
Von nem fehler hab ich noch nie was gehört.
Ich vermute mal das ist schwachsinnn.Außerdem gefällt mir dein script vom prinzip her schon garnicht.
Such mal bei google was zum thema "scandir"
-
Seit wann gibt es in PHP einen !==-Operator?
Das gesamte Scripts ist ziemlich verbuggt und undurchsichtig. Zudem ließe sich dass wesentlich platzsparender, übersichtlicher und besser wartbar formulieren ...
-
Reyx schrieb:
Seit wann gibt es in PHP einen !==-Operator?
schon immer
Das gesamte Scripts ist ziemlich verbuggt und undurchsichtig. Zudem ließe sich dass wesentlich platzsparender, übersichtlicher und besser wartbar formulieren ...
machn vorschlag plz
Würd sagen lass die " weg
hab ich schon probiert, kommt leider der gleiche fehler
scandir
scandir is leider php5 und ich hab nur zugang aufs 4.3.0er (und außerdem au net rekursiv)
Weitere Vorschläge?
-
z.B. so, ist aber ein anderer Ansatz:
function dsScanDir($Path) { $Output = array(); if(!is_dir($Path) || !is_readable($Path)) { return $Output; } $Handle = opendir($Path); readdir($Handle); readdir($Handle); for($cnt = 0; ($CurrentFile = readdir($Handle)) !== false; ++$cnt) { if(is_dir($Path.'/'.$CurrentFile)) { $Output[$cnt] = array( $CurrentFile => dsScanDir($Path.'/'.$CurrentFile)); continue; } $Output[$cnt] = $CurrentFile; } closedir($Handle); return $Output; }
-
k, thx, wie gesagt, bin neu in php
so gehts jedenfalls
-
wobei man sich nicht unbedingt darauf verlassen sollte, dass "./" und "../" zuerst ausgelesen werden (die 2 readdirs) IMHO. kommt wohl aufs system an: [quote php]Die Dateinamen werden in der Reihenfolge zurück gegeben, in der sie innerhalb des Filesystems angelegt wurden.[/quote]
-
foo schrieb:
Reyx schrieb:
Seit wann gibt es in PHP einen !==-Operator?
schon immer
Das gesamte Scripts ist ziemlich verbuggt und undurchsichtig. Zudem ließe sich dass wesentlich platzsparender, übersichtlicher und besser wartbar formulieren ...
machn vorschlag plz
Würd sagen lass die " weg
hab ich schon probiert, kommt leider der gleiche fehler
scandir
scandir is leider php5 und ich hab nur zugang aufs 4.3.0er (und außerdem au net rekursiv)
Weitere Vorschläge?Ich hab dem eigentlich nichts hinzuzufügen bis auf ein paar Tipps/Hinweise für die Zukunft:
soweit ich weiß bestehen Vergleichsoperatoren nur aus max 2 zeichen. !== wird demnach != geschrieben - womit ich nicht sagen will dass bei relativer Mondfeuchtigkeit !== NICHT funktioniert
Außerdem solltest du dir mal Grundlegendes über Wertezuweisungen und Vergleiche in PHP ansehen (ich sag nur "false !== ( $name = readdir( $handle ) )"
- Überflüssige Leerzeichen vermeiden das lässt den Code überschaubarer. Ein Ausdruck in Klammern sollte auch als solcher erkennbar sein und nicht als Gewusel aus Operatoren und anderen Sonderzeichen - außerdem schont's die Leertaste
- wenn du mit Arrays in Schleifen arbeitest, und bei jedem Durchlauf z.B. den nächsten Index brauchst, dann empfiehlt es sich oft wie... moment wie hieß er noch... Reyx ne for-Schleife zu nehmen (muss gleich nochmal gucken warum er preinkrementiert hat
)
- falls möglich keine Funktionen in Schleifen-Bedingung (ok bei einer while isses manchmal sinnvoll. (zum Bleistift while(... = mysql_fetch_array(...)) )
Aber nicht for($i = 0; miez); $i++) machen - das verlängert die Laufzeit bei größeren Funktionen nur unnötig.hast du das php manual? http://www.php.net/docs.php
Das sind so Sachen wir im Unterricht eingeprügelt bekommen haben... ich denke mal wenn du in PHP neu bist, sollte das vielleicht hilfreich sein.
-
Soweit alles richtig, bis auf:
soweit ich weiß bestehen Vergleichsoperatoren nur aus max 2 zeichen. !== wird demnach != geschrieben - womit ich nicht sagen will dass bei relativer Mondfeuchtigkeit !== NICHT funktioniert
An der Stelle hatte ich selbst kurz einen Blackout, da der !==-Operator noch seltener genutzt wird, als der ===-Operator.
Verwechseln sollte man die beiden aber dennoch nicht, denn != bzw. == prüfen auf Konkgruenz, !== und === auf Gleichheit!P.s. Präinkrement ist effizienter, da keine Kopie der Variablen erzeugt wird!