Fehler im Skript:: Dateien und Unterordner zählen

Hallo,

ich habe folgendes Skript (zuvor umgeschrieben, angegelichen und ergänzt) , aber leider erhalte ich eine Fehlermeldung:

„Warning: Invalid argument supplied for foreach()“

Auf einer anderen Seite fand ich heraus, dass es daran liegt, weil foreach ein array erwartet, z.B. $ordner = array ();
Wenn ich also in der Zeile
#$ordner = array ();
das „#“ entferne, kommt zwar keine Fehlermeldung mehr, jedoch erhalte ich eine falsche Anzahl an Ordnern und Dateien. Wie kann ich das korrigieren?

Wie muss die Zeile (string-Befehl) aussehen, damit in einem bestimmten Verzeichnis nur die *.jpg-Dateien (und auch die Ordner) gezählt werden?

Wer kann mir helfen?
Würde mich über Antworten sehr freuen. Danke!

PHP-Code:

<?php function count_all_files_and_dirs_recursive($dir,$endung)
{ $count = array('datei'=\>0,'ordner'=\>0) ; $ordner = glob($dir.'/\*',GLOB\_ONLYDIR); $count['datei'] += count(glob($dir.''.$endung)); $count['ordner'] += count($ordner); #$ordner = array (); foreach($ordner as $dir) { $next = call\_user\_func(\_\_FUNCTION\_\_,$dir,$endung); $count['datei'] += $next['datei']; $count['ordner'] += $next['ordner']; } return $count; } $count = count\_all\_files\_and\_dirs\_recursive('./web-alben/','.jpg'); echo "Es befinden sich {$count['datei']} Bild(er) und " . "{$count['ordner']} Unterverzeichnis(se) im Ordner: "; ?\>

Hallo

Auf einer anderen Seite fand ich heraus, dass es daran liegt,
weil foreach ein array erwartet, z.B. $ordner = array ();
Wenn ich also in der Zeile
#$ordner = array ();
das „#“ entferne, kommt zwar keine Fehlermeldung mehr, jedoch
erhalte ich eine falsche Anzahl an Ordnern und Dateien. Wie
kann ich das korrigieren?

glob() liefert normalerweise ein Array zurück. Wenn man es aber auf ein leeres Verzeichnis, auf ein Verzeichnis, das es gar nicht gibt oder auf ein Verzeichnis, für das PHP keine Leserechte hat, anwendet, ist das Ergebnis kein Array, sondern FALSE. Damit hat aber foreach ein Problem.

Mit

$ordner = array();

stellst su zwar sicher, dass $ordner ein Array ist, aber du überschreibst damit sämtliche von glob() gelieferten Daten.

Mit

if ($variablenname) 

kann man prüfen, ob die Variable einen Inhalt hat. Für die Werte ‚‘, 0, ‚0‘, NULL, FALSE und array() wird nicht ausgeführt.

Beim Zählen der Dateien muss das Ergebnis von glob() ebenfalls überprüft werden, denn count(FALSE) ist 1.

Zuletzt: Du hast die Variable $dir doppelt belegt. In diesem Fall macht das nichts, weil du den ursprünglichen Wert von $dir in und nach der foreach-Anweisung nicht mehr benötigst. In anderen Situationen kann das aber Probleme machen.

function count_all_files_and_dirs_recursive($dir,$endung)
{
$count = array(‚datei‘=>0,‚ordner‘=>0) ;
$datei = glob($dir.’’.$endung);
if ($datei)
$count[‚datei‘] += count($datei);
$ordner = glob($dir.’/*’,GLOB_ONLYDIR);
if ($ordner)
{
$count[‚ordner‘] += count($ordner);
foreach($ordner as $dir)
{
$next = count_all_files_and_dirs_recursive($dir,$endung);
$count[‚datei‘] += $next[‚datei‘];
$count[‚ordner‘] += $next[‚ordner‘];
}
}
return $count;
}

$count = count_all_files_and_dirs_recursive(’.’,’.jpg’);
echo "Es befinden sich {$count[‚datei‘]} Bild(er) und "
. "{$count[‚ordner‘]} Unterverzeichnis(se) im Ordner: ";