PHP: Codehilfe & Optimierung !?

CSS und andere hilfreiche Anweisungen
Benutzeravatar
Rettungsfuzzy
Mitglied (Level 3)
Mitglied (Level 3)
Beiträge: 29
Registriert: So 28. Feb 2021, 20:31

PHP: Codehilfe & Optimierung !?

Ungelesener Beitrag von Rettungsfuzzy »

Nun brauche ich mit meinen eher rudimentären Kenntnissen mal wieder eure Hilfe...

Ich bin gerade dabei, mir eine Seite zu basteln, die mir den Inhalt nebst Nebeninfos (je) eines Verzeichnisses (mit Unterordnern durch _GET() anzeigen soll (vgl. MS-Explorer ohne Navispalte)

example.de/verzeichnis.php = ./file oder
example.de/verzeichnis.php?id=test3/unterordner1 = ./files/test3/unterordner1

Code: Alles auswählen

		// Einstellungen:
		$verzeichnis	= 'files';	// DateiVerzeichnis


		if ($_GET['id'] != "") {
			$verz = $verzeichnis.'/'.$_GET['id'];
			} else {
				$verz = $verzeichnis;
				}

	// Gibt eine Instanz der Directory Klasse an $dirHandle zurück
	$dirHandle = dir($verz);
	// Verzeichnis Datei für Datei lesen
	while (($f = $dirHandle->read()) != false) {
		// Nur ausgeben, wenn nicht . oder .., es sich abr um ein Verzeichnis handelt
		if ($f != "." && $f != ".." && is_dir($verz."/".$f)) {
			echo "Ordner: ".$f."<br>";
			} elseif ($f != "." && $f != ".." && !is_dir($verz."/".$f)) {
				$file = "./".$verz."/".$f;
				$fsize = filesize($file);
				$fsize = ($fsize < 1024) ? $fsize . " B" : (($fsize >= 1048576) ? number_format(($fsize / 1024 / 1024), 2, ",", ".") . " MB" : number_format(($fsize / 1024), 0, ",", ".") . " KB");
				echo "Datei: ".$f." / Format: ".pathinfo($file)['extension']." / Pfad: ".$file." / Name: ".pathinfo($file)['filename']." / Größe: ".$fsize." / Datum: ".date("d.m.Y - H:i", filemtime($file))."<br>";
				}
		}
	// Verzeichnis wieder schließen
	$dirHandle->close();
aber (mein Problem) ist, daß die Liste immer relativ unsortiert ausgegeben wird ...
Alle Versuche (ja, ich bin ein Tray&Error-Mensch!) mit sort() sind mir erfolglos geblieben, obgleich sort(dirHandle) doch hätte helfen müssen, oder?!?

Außerdem wollte ich fragen, ob ich den Code noch weiter optimieren kann/sollte ??

LG RF
Wer etwas erreichen will, sucht Wege - Wer etwas verhindern will, sucht Gründe!
Benutzeravatar
Werner-Zenk.de
Mitglied (Level 10)
Mitglied (Level 10)
Beiträge: 755
Registriert: Di 8. Dez 2020, 19:42
Wohnort: Bamberg
Kontaktdaten:

Re: PHP: Codehilfe & Optimierung !?

Ungelesener Beitrag von Werner-Zenk.de »

Der Inhalt des Verzeichnisses muss zuerst in ein Array geladen werden damit dieses mit sort() usw. sortiert werden kann.
https://werner-zenk.de/php/dateien_ausl ... tieren.php
https://werner-zenk.de/php/dateien_im_v ... filter.php
https://werner-zenk.de/php/alle_dateien ... zeigen.php
https://werner-zenk.de/php/verzeichniss ... suchen.php
https://werner-zenk.de/scripte/verzeich ... uepfen.php
Meiner Meinung nach hat der Code die Breite von 80 Zeichen längst überschritten, wer möchte beim Programmieren schon horizontal scrollen, außer der autom. Zeilenumbruch wurde aktiviert.
Benutzeravatar
Rettungsfuzzy
Mitglied (Level 3)
Mitglied (Level 3)
Beiträge: 29
Registriert: So 28. Feb 2021, 20:31

Re: PHP: Codehilfe & Optimierung !?

Ungelesener Beitrag von Rettungsfuzzy »

Ich habs befürchtet - da ist es wieder ... Mein Lieblingswort "Array" :evil:
Ich dachte, der Code wäre ein Array - Also son einfaches zumindest, ohne Nummern und Schlüsseln usw. :verlegen:

Ich kapier das mit diesen Arrays nicht - Ich meine,wie diese funktionieren... Dafür bin ich regelmäßig zu doof
Erinnerst du dich noch an meinen Versuch ein LogIn-Script zu erfinden (damals Ersatz für NOF)...? - Da hab ich mir rd. 6 Monate den Kopf zermatert, bis ich hörte, daß es fgetcsv() gibt, die genau das bot, was ich brauchte. um die Sessions richtig zu füllen.

Meiner Meinung nach hat der Code die Breite von 80 Zeichen längst überschritten, ... , außer der autom. Zeilenumbruch wurde aktiviert.
Jep! - Sorry.

LG RF
Wer etwas erreichen will, sucht Wege - Wer etwas verhindern will, sucht Gründe!
Benutzeravatar
Werner-Zenk.de
Mitglied (Level 10)
Mitglied (Level 10)
Beiträge: 755
Registriert: Di 8. Dez 2020, 19:42
Wohnort: Bamberg
Kontaktdaten:

Re: PHP: Codehilfe & Optimierung !?

Ungelesener Beitrag von Werner-Zenk.de »

Hier die Optimierung von mir:

Code: Alles auswählen

<?php
// Einstellungen:
$verzeichnis = 'files'; // DateiVerzeichnis

if ($_GET['id'] != "") {
    $verz = $verzeichnis . '/' . $_GET['id'];
} else {
    $verz = $verzeichnis;
}

// Gibt eine Instanz der Directory Klasse an $dirHandle zurück
$dirHandle = dir($verz);

$verzeichnisse = [];
$dateien = [];

// Verzeichnis Datei für Datei lesen
while (($f = $dirHandle->read()) != false) {
    // Nur ausgeben, wenn nicht . oder .., es sich abr um ein Verzeichnis handelt
    if ($f != "." && $f != "..") {
        if (is_dir($verz . "/" . $f)) {
            $verzeichnisse[] = $f . "<br>";
        } else {
            $file = "./" . $verz . "/" . $f;
            $fsize = filesize($file);
            $fsize = ($fsize < 1024) ? $fsize .
            " B" : (($fsize >= 1048576) ? number_format(($fsize / 1024 / 1024), 2, ",", ".") .
                " MB" : number_format(($fsize / 1024), 0, ",", ".") . " KB");
            $dateien[] = $f . " / Format: " . pathinfo($file)['extension'] .
            " / Pfad: " . $file . " / Name: " . pathinfo($file)['filename'] . " / Größe: " . $fsize .
            " / Datum: " . date("d.m.Y - H:i", filemtime($file)) . "<br>";
        }
    }
}
// Verzeichnis wieder schließen
$dirHandle->close();

natcasesort($verzeichnisse);
natcasesort($dateien);

echo '<h3>Verzeichnisse: ' . count($verzeichnisse) . '</h3>';

foreach ($verzeichnisse as $verzeichnis) {
    echo $verzeichnis;
}

echo '<h3>Dateien: ' . count($dateien) . '</h3>';

foreach ($dateien as $datei) {
    echo $datei;
}
?>
Zuletzt geändert von Werner-Zenk.de am Mo 20. Mär 2023, 21:11, insgesamt 1-mal geändert.
Grund: 21:10 Uhr Code verbessert
Benutzeravatar
Rettungsfuzzy
Mitglied (Level 3)
Mitglied (Level 3)
Beiträge: 29
Registriert: So 28. Feb 2021, 20:31

Re: PHP: Codehilfe & Optimierung !?

Ungelesener Beitrag von Rettungsfuzzy »

Hallo Werner,

vielen Dank für deine Überarbeitung - Ich hab das mal verglichen, gestern & heute das Netz und meine Erbse weiter gequält um Arrays zu begreifen und dabei 3 Dinge gefunden, wo ich gerne nochmal nachhaken möchte...


1. Wenn ich das richtig verstehe leitet "[]" das array ein... Ist dann

Code: Alles auswählen

$verzeichnisse = [];
$dateien = [];
(Zeile 14-15)
überhaupt nötig, oder wozu ist das sinnvoll? - Weil ob mit oder ohne diese beiden Zeilen, es funktioniert...


2. habe ich

Code: Alles auswählen

$dateien[] = $f . " / Format: " . pathinfo($file)['extension'] .
	" / Pfad: " . $file . " / Name: " . pathinfo($file)['filename'] . " / Größe: " . $fsize .
	" / Datum: " . date("d.m.Y - H:i", filemtime($file)) . "<br>";
mit

Code: Alles auswählen

$dateien[] = array(
	'name' => pathinfo($file)['filename'],
	'ext' => pathinfo($file)['extension'],
	'size' => $fsize,
	'date' => date("d.m.Y - H:i", filemtime($file)),
	);
ausgetauscht, was mir nun die Aufstellung nicht nur nach Zeilen, sondern auch nach Spalten ermöglicht, wodurch ich die Werte auch einzeln verwenden könnte bzw. kann... aber dafür funktioniert die Sortierung nicht mehr...
Ich hatte gehofft & (offensichtlich fälschlich) vermutet, dadurch die Daten mit z.B.

Code: Alles auswählen

natcasesort($dateien['size']);
vor der Ausgabe nach meinen (späteren) Wünschen sortieren zu können... Stattdessen bleibt die Seite aber weiß!


3. Worin besteht, der bessere Unterschied/Vorteil bei

Code: Alles auswählen

if ($f != "." && $f != "..") {
	if (is_dir($verz . "/" . $f)) {
		...
		} else {
			...
			}
	}
vs.

Code: Alles auswählen

if ($f != "." && $f != ".." && is_dir($verz."/".$f)) {
	...
	} elseif ($f != "." && $f != ".." && !is_dir($verz."/".$f)) {
		...
		}
LG RF
Wer etwas erreichen will, sucht Wege - Wer etwas verhindern will, sucht Gründe!
Benutzeravatar
Werner-Zenk.de
Mitglied (Level 10)
Mitglied (Level 10)
Beiträge: 755
Registriert: Di 8. Dez 2020, 19:42
Wohnort: Bamberg
Kontaktdaten:

Re: PHP: Codehilfe & Optimierung !?

Ungelesener Beitrag von Werner-Zenk.de »

Hallo,
zu Punkt 3:
Da reicht eine Überprüfung aus, wozu noch einmal überprüfen.

Zu Punkt 1: Man deklariert Arrays zuvor (außerhalb der Schleife) auch wenn das nicht notwendig ist, das gehört zum guten Programmiersiel dazu.

Zu Punkt 2:
Zeige mit: print_r($dateien[]); den Inhalt deines Arrays an, dann siehst du auch wie du darauf zugreifen kannst.
Normalerweise müsste eine PHP-Fehlermeldung erscheinen, eine leere weiße Seite ist ein Indiz für eine PHP-Fehlermeldung die nicht angezeigt wird.
Schreibe beim Testen immer an den Anfang des PHP-Skripts folgendes;

Code: Alles auswählen

// PHP Fehlermeldungen anzeigen
error_reporting(E_ALL);
ini_set('display_errors', true);
https://www.php.net/manual/de/function.natcasesort
https://www.php.net/manual/de/function. ... tisort.php
Benutzeravatar
Rettungsfuzzy
Mitglied (Level 3)
Mitglied (Level 3)
Beiträge: 29
Registriert: So 28. Feb 2021, 20:31

Re: PHP: Codehilfe & Optimierung !?

Ungelesener Beitrag von Rettungsfuzzy »

Danke, ...das leuchtet ein :)

zu 2. weiß ich nicht, was ich da verbaselt hatte - Ich war wohl zu müde...
Ich hatte alles wieder auf den letzten Stand zuvor zurückgesetzt und konnte den Fehler jedenfalls nicht mehr reproduzieren.... Da war wohl woanders ein fehlendes Semikolon, oder so.

Nun gibt er die Liste unsortiert aus, und als Warnung erscheint nur:
Warning: natcasesort() expects parameter 1 to be array, null given in /var.../test2.php on line 158
( natcasesort($files['size']); ) - ...hab die Variablen in $folders & $files umbenannt.

Im Netz habe ich folgenden Schnipsel gefunden (den ich angepasst habe) ... damit funktioniert es, wie beabsichtigt!

Code: Alles auswählen

// Eigenes Suchmuster der Dateien nach 'name'
function _sort($files = array (), $art, $reinfolge=SORT_DESC) {
	 if(is_array($files)==true) {
		 foreach ($files as $key => $value) {
			 if(is_array($value)==true) {
				 foreach ($value as $kk => $vv) {
					 ${$kk}[$key] = strtolower( $value[$kk]);
					 }
				 }
			 }
	 }
	 array_multisort(${$art}, $reinfolge, $files);
	 return $files;
	}
$files=_sort($files, 'name', SORT_ASC);

Nun kann und muss ich mich nur noch mit der Frage beschäftigen, wie ich die Variable "$files[$x]['name']" an das MBR-Formular übergeben kann...

LG RF
Wer etwas erreichen will, sucht Wege - Wer etwas verhindern will, sucht Gründe!
Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste