PHP Foreach Loop sortieren

OP #7423937

Hi,

Ich habe folgenden Code

1
foreach (glob("database/*.php") as $filename)
2
{
3
    include $filename;
4
//Here i'm doing stuff with the files content
5
}

Ich hätte gerne eine möglichkeit zu sortieren das entweder die ältesten oder neuesten Einträge/Datein als erstes angezeigt werden.

Kann mir jemand sagen wie ich das hinbekomme? (Am besten direkt den codeschnippsel entsprechend anpassen.)

Edit:

In den Datein befindet sich immer folgendes $item_id = "1"; (bzw. 2,3,4,5 etc.) Danach könnte man ggf. auch sortieren.

Helge M. schrieb:

Ich hätte gerne eine möglichkeit zu sortieren das entweder die ältesten oder neuesten Einträge/Datein als erstes angezeigt werden.

Zwei Schleifen. Einmal über alle Einträge laufen, einmal "stat" für jeden Dateinamen machen, das in ein Array speichern. Das kannst du dann nach Größe, Datum, Besitzer, Inode-Nr oder sonstwas sortieren. Zweite Schleife dann über das Sortierte Array.

Gast

Du baust dir eine Hilfsfunktion sortByModTime( $einArray) die das sortierte Array zurückliefert. Als Parameter erhält die Funktion ein Array mit Dateinamen, also das was glob liefert.

Die Änderungszeit einer Datei kannt du mit https://www.php.net/manual/en/function.filemtime.php rausbekommen. Nach der Zeit sortierst die files. Du baust dir einfach ein neues array als Assoziatives Array, mit der Zeit als Index, nach dem sortiert du wenn du das Array das als Paramter durchgelaufen bist.

statt glob(....) rufst du dann sortByModTime(glob(...)) auf.

Wenn nach dieser id-Geschichte sorotert werden soll, schreibst du dir eine weitere Funktion dafür.

Herbert B. schrieb:

Du baust dir eine Hilfsfunktion sortByModTime( $einArray) die das sortierte Array zurückliefert. Als Parameter erhält die Funktion ein Array mit Dateinamen, also das was glob liefert.

Die Änderungszeit einer Datei kannt du mit https://www.php.net/manual/en/function.filemtime.php rausbekommen. Nach der Zeit sortierst die files. Du baust dir einfach ein neues array als Assoziatives Array, mit der Zeit als Index, nach dem sortiert du wenn du das Array das als Paramter durchgelaufen bist.

statt glob(....) rufst du dann sortByModTime(glob(...)) auf.

Wenn nach dieser id-Geschichte sorotert werden soll, schreibst du dir eine weitere Funktion dafür.

naja, die Zeit als Index könnte doppelte Einträge haben die dann überschrieben würden. Wenn, dann muss das n Array im Array werden ...

[12345]['file1','file2', ...]

Wobei die Anforderung schon ein wenig schräg ist. Wenn ich alle Dateien in einem Verzeichnis include, und dabei eine bestimmte Reihenfolge brauche, dann vmtl. wegen Abhängigkeiten zwischen den Dateien. Und die Abhängigkeiten würde ich ungern dadurch definieren, wann ich das letzte Mal mit dem Editor an der Datei war. Besser:

database/01_basis.php database/10_erweiterung.php database/99_ende.php etc.

glob() sortiert direkt alphabetisch (solange man das nicht explizit anders haben will) und schon hat man das Problem erschlagen.

OP

Danke für die Antworten, ich bin allerdings etwas überfordert damit. Kann mir vllt. jemand den Codeschnippsel oben entsprechend anpassen?

glob() sortiert direkt alphabetisch (solange man das nicht explizit anders haben will) und schon hat man das Problem erschlagen.

Ich habe derzeit

database/item1.php database/item2.php ...

Die Sortierung scheint entsprechend zu funktionieren, allerdings würde ich gerne die Reihenfolge umkehren und das scheint über glob nicht zu funktionieren oder?

Wenn nach dieser id-Geschichte sorotert werden soll, schreibst du dir eine weitere Funktion dafür.

naja, die Zeit als Index könnte doppelte Einträge haben die dann überschrieben würden. Wenn, dann muss das n Array im Array werden ...

Vllt sollte man dann doch besser hier nach sortieren?

In den Datein befindet sich immer folgendes $item_id = "1"; (bzw. 2,3,4,5 etc.)

OP

Okay ich hab es jetzt doch hinbekommen.

1
//Grab and sort Items
2
if($display_latest_on_top == FALSE)
3
{
4
//Oldest First
5
$myarray = glob("database/*.php");
6
usort($myarray, function($a,$b){
7
$results = filemtime($a) - filemtime($b); 
8
return $results;
9
});
10
}
11
if($display_latest_on_top == TRUE)
12
{
13
//Latest First
14
$myarray = glob("database/*.php");
15
usort($myarray, function($a,$b){
16
$results = filemtime($b) - filemtime($a); 
17
return $results;
18
});
19
}
20
//Display Items
21
foreach ($myarray as $filename)
22
{
23
include $filename;
24
//Here i'm doing stuff with the files content
25
}

Edit:

Sehr hilfreich war hierbei https://stackoverflow.com/questions/20930122/sort-glob-by-creation-date

OP

Eigentlich funktioniert das gut, nur leider handelt es sich um das letzte Änderungsdatum und nicht um das Erstellungsdatum der Datei. Eine kurze recherche ergab das es unter unix/linux wohl kein Erstellungsdatum gibt.

Daher würde ich dann doch lieber hiernach sortieren:

In den Datein befindet sich immer folgendes $item_id = "1"; (bzw. 2,3,4,5 etc.)

Eigentlich kann das ja wirklich nur eine Kleinigkeit sein aber ich weiß grad nicht wie. Kann mir jemand den Code aus meinem letzten post entsprechend anpassen? :)

OP

Problem solved!

1
<?php
2
//Sort Method "Item Id"
3
if($sort_method == "item_id")
4
{
5
//Grab and Sort Items
6
$myarray = glob("database/*.php");
7
foreach ($myarray as $filename)
8
{
9
include $filename;
10
$item_id_string .= "$item_id,";
11
}
12
$item_id_string = substr($item_id_string, 0, -1);
13
$item_id_string = explode(',', $item_id_string);
14

15
if($display_latest_on_top == FALSE)
16
{
17
//Oldest First
18
usort($item_id_string, function($a,$b){
19
return $a - $b; 
20
});
21
}
22
if($display_latest_on_top == TRUE)
23
{
24
//Latest First
25
usort($item_id_string, function($a,$b){
26
return $b - $a; 
27
});
28
}
29

30
//Display Items
31
foreach ($item_id_string as $item_id) 
32
{
33
include ("database/item$item_id.php");
34
//Here i'm doing stuff with the files content
35
}
36
}
37

38
if($sort_method == "last_edited")
39
{
40
//Grab and sort Items
41
if($display_latest_on_top == FALSE)
42
{
43
//Oldest First
44
$myarray = glob("database/*.php");
45
usort($myarray, function($a,$b){
46
$results = filemtime($a) - filemtime($b); 
47
return $results;
48
});
49
}
50
if($display_latest_on_top == TRUE)
51
{
52
//Latest First
53
$myarray = glob("database/*.php");
54
usort($myarray, function($a,$b){
55
$results = filemtime($b) - filemtime($a); 
56
return $results;
57
});
58
}
59
//Display Items
60
foreach ($myarray as $filename)
61
{
62
include $filename;
63
//Here i'm doing stuff with the files content
64
}
65
}
66
?>

Helge M. schrieb:

Die Sortierung scheint entsprechend zu funktionieren, allerdings würde ich gerne die Reihenfolge umkehren und das scheint über glob nicht zu funktionieren oder?

Reihenfolge umkehren geht mit "array_reverse". Wenn dir das reicht, bleibt's beim Dreizeiler:

1
foreach (array_reverse(glob("database/*.php")) as $filename) {
2
  include $filename;
3
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 3 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.