newline
Goto Top

Dateien zählen mit Filter - php

Hallo,

ich habe ein Script am laufen, dass mir gute Dienste leistet und bestimmte Dateien zählt.
Nun bin ich kein IT-Fachmann, bastele aber gern und muss mein Script anpassen.

Bisher konnte ich einfach meine Dateien zählen.
Jetzt kommen aber verschiedene Dateien (3 Gruppen) zusammen, die sich nur aufgrund ihrer Größe unterscheiden: <=10kb, 20-30kb und >=100.

Nun möchte ich gerne die jeweilige Anzahl anzeigen und bin auch bei php soweit fündig geworden: function.count

Hier mein bisheriger Code:
<?php
$anzahl=0;
$verz=opendir (".");  
while ($file = readdir ($verz)) {
    if(strtolower(substr($file,-4))==".csv"){  
    $anzahl+=1;
    }
}
closedir($verz);
echo "\n Es sind $anzahl Dateien vorhanden.\n";  
?>

Bisher arbeite ich mit while, muss aber nach Vorgabe bei php ein array nutzen, wobei hier die Einstellung (Filter) der Größen notwendig wäre (möglichst flexibel), denke ich ...
Wie ich hier vorgehen soll weiß ich nicht und würde mich daher über Hilfe freuen!

newline

Content-Key: 665587

Url: https://administrator.de/contentid/665587

Printed on: April 16, 2024 at 09:04 o'clock

Mitglied: 148121
Solution 148121 Apr 09, 2021 updated at 11:16:25 (UTC)
Goto Top
z.B.
<?php
$files = glob('*.csv');  
$filesSmaller10KB = 0;
$files20to30KB = 0;
$filesBigger100KB = 0;

foreach($files as $file){
	$size = filesize($file);
	switch(true){
		case ($size <= 1024 * 10):
			$filesSmaller10KB++;
			break;
		case ($size >= 1024 * 20 && $size <= 1024 * 30):
			$files20to30KB++;
			break;
		case ($size >= 1024 * 100):
			$filesBigger100KB++;
			break;
	}
}
echo "Files smaller/equal to 10KB : $filesSmaller10KB <br>";  
echo "Files between 20KB and 30KB : $files20to30KB <br>";  
echo "Files bigger/equal 100KB : $filesBigger100KB <br>";  
?>
Oder wenn du zusätzlich die Dateinamen in Arrays der jeweiligen Größen brauchst
<?php
$files = glob('*.csv');  
$filesSmaller10KB = array();
$files20to30KB = array();
$filesBigger100KB = array();

foreach($files as $file){
	$size = filesize($file);
	switch(true){
		case ($size <= 1024 * 10):
			array_push($filesSmaller10KB,$file);
			break;
		case ($size >= 1024 * 20 && $size <= 1024 * 30):
			array_push($files20to30KB,$file);
			break;
		case ($size >= 1024 * 100):
			array_push($filesBigger100KB,$file);
			break;
	}
}
echo "<p style=\"font-weight:bold\">Files smaller/equal to 10KB : " . count($filesSmaller10KB) . "</p>";  
echo "<pre>" . implode("<br>",$filesSmaller10KB) . "</pre>";  
echo "<p style=\"font-weight:bold\">Files 20KB to 30KB : " . count($files20to30KB) . "</p>";  
echo "<pre>" . implode("<br>",$files20to30KB) . "</pre>";  
echo "<p style=\"font-weight:bold\">Files bigger/equal 100KB : " . count($filesBigger100KB) . "</p>";  
echo "<pre>" . implode("<br>",$filesBigger100KB) . "</pre>";  
?>
Member: newline
newline Apr 09, 2021 at 11:24:25 (UTC)
Goto Top
Hallo warranty,

ich bin völlig baff, das ist ja hier eine "Soforthilfe"!

Meinen Ansatz weiter zu entwickeln ist damit gescheitert. Wenn ich deinen Vorschlag gerade teste und ihn mir genauer ansehe, finde es total klasse, wie variabel die Möglichkeiten sind - falls eine weitere Bedingung gebraucht wird.
Vielleicht hilft der Vorschlag auch anderen.

Bei php werden zwar viele Anwendungs-Beispiele aufgeführt, allerdings habe ich bei foreach keinen Vorschlag mit einem weitergehenden Schalter 'switch' gefunden. Daher freue mich sehr über deine Hilfe, vielen Dank warranty!

newline
Mitglied: 148121
148121 Apr 09, 2021 updated at 11:27:36 (UTC)
Goto Top
Statt dem von mir genutzten "switch"-Konstrukt kannst du hier als Alternative immer auch einfach ein If elseif elseif endif nutzen wenn du willst.
https://www.php.net/manual/de/control-structures.elseif.php
Member: newline
newline Apr 09, 2021 updated at 11:29:31 (UTC)
Goto Top
... du hast mir gleich eine zweite Frage beantwortet face-smile

Lieben Dank dir für deine Mühe!

Btw: Ich bin gar nicht auf die Idee gekommen auch unter 'If elseif elseif endif' zu schauen, da ich in meinem Ursprungscode zu verhaftet war ... face-smile
Member: newline
newline Apr 09, 2021 updated at 12:28:47 (UTC)
Goto Top
Eine Frage habe ich noch zu deinen Werten: 'case ($size <= 1024 * 10):'

Die Frage muss glaube ich lauten: Welche Änderungen muss ich für Bytes-Angabe anstatt KB-Angabe machen?
Also z.B. für 10b anstatt 10kb?
Member: MrCount
Solution MrCount Apr 09, 2021 at 12:32:46 (UTC)
Goto Top
Zitat von @newline:

Eine Frage habe ich noch zu deinen Werten: 'case ($size <= 1024 * 10):'

Die Frage muss glaube ich lauten: Welche Änderungen muss ich für Bytes-Angabe anstatt KB-Angabe machen?
Also z.B. für 10b anstatt 10kb?

das wäre dann
$size <= 10
Member: newline
newline Apr 09, 2021 at 12:52:57 (UTC)
Goto Top
SUPER (das ist ja einfach) face-smile

Vielen Dank euch!!!
Mitglied: 148121
148121 Apr 09, 2021 updated at 14:36:33 (UTC)
Goto Top
Zitat von @newline:

Eine Frage habe ich noch zu deinen Werten: 'case ($size <= 1024 * 10):'

Die Frage muss glaube ich lauten: Welche Änderungen muss ich für Bytes-Angabe anstatt KB-Angabe machen?
Also z.B. für 10b anstatt 10kb?
Als Anfänger als erstes immer das Manual zur Rate ziehen, dann sind solche Fragen überflüssig face-wink.
https://www.php.net/manual/de/function.filesize.php
Gibt die Größe einer Datei in Bytes zurück
Wobei hier ja eigentlich Mathe erste Klasse ausgereicht hätte 1KB = 1024 bytes
Member: ASP.NET.Core
ASP.NET.Core Apr 09, 2021 at 18:01:33 (UTC)
Goto Top
switch(true) macht keinen Sinn, das soll wahrscheinlich switch($size) heißen face-wink
Mitglied: 148121
148121 Apr 09, 2021 updated at 19:26:03 (UTC)
Goto Top
Zitat von @ASP.NET.Core:

switch(true) macht keinen Sinn, das soll wahrscheinlich switch($size) heißen face-wink
Falsch, das macht hier sehr wohl Sinn wenn du im Case individuell und nicht nur auf feste Werte prüfen willst! Wohl noch nie selbst ausprobiert 😉.
Member: newline
newline Apr 10, 2021 at 19:33:39 (UTC)
Goto Top
Zitat von @148121:
Als Anfänger als erstes immer das Manual zur Rate ziehen, dann sind solche Fragen überflüssig face-wink.
Danke für den Hinweis, warranty, die Manual-Seite ist ja cool!
Zitat von @148121:
Wobei hier ja eigentlich Mathe erste Klasse ausgereicht hätte 1KB = 1024 bytes
Obwohl, 1. Klasse wäre doch zu tief gegriffen:
KC:
1. Klasse Mathe: Zahlenraum <20
2. Klasse Mathe: Zahlenraum <100
3. Klasse Mathe: Zahlenraum < 1000
4. Klasse Mathe: Zahlenraum > 1000
... dauert in Deutschland, bis man/frau ein guter Programmierer werden kann 😁