Ordinamento dei file con FileMime () e USORT () dà risultati casuali
-
20-12-2019 - |
Domanda
Sto usando usort()
e filemtime()
per ordinare i file mediante la data di modifica, ma restituisce casualmente i file nell'ordine sbagliato.Immagino che mi manchi qualcosa di veramente semplice ma non riesco a capire cosa.
usort($user_files, function($a, $b) {
return filemtime($a) > filemtime($b);
});
foreach ($user_files as $f) {
echo $f . "<br />";
}
.
Dopo di che caricare il file. codice completo .
Quando caricano i file 1.txt
... 10.txt
per testare ciò che stava andando nei risultati visualizzati erano:
6.txt
5.txt
4.txt
3.txt
2.txt
1.txt
7.txt Uploaded!
.
come previsto.Quindi, quando ho raggiunto 8.txt
:
6.txt
7.txt
5.txt
4.txt
2.txt
3.txt
1.txt
8.txt Uploaded!
.
Un'altra volta stava bene finché non ho raggiunto 10.txt
:
7.txt
8.txt
9.txt
6.txt
5.txt
2.txt
3.txt
4.txt
1.txt
10.txt Uploaded!
.
while ls -t
restituito:
10.txt 9.txt 8.txt 7.txt 6.txt 5.txt 4.txt 3.txt 2.txt 1.txt
.
Allora ... cosa sta succedendo lì?
Debian Wheezy 7.4, up-to-date.
PHP Version 5.4.4-14+deb7u8
Linux pc 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64
FPM/FastCGI
nginx/1.2.1
. Soluzione 2
Ho capito ciò che è stato sbagliato e, come previsto, non aveva nulla a che fare con usort
.La funzione utilizzata per ottenere i file stava ottenendo solo i nomi dei file, non il percorso assoluto per loro.Quindi filemtime
veniva chiamato con una stringa priva di significato.Non ho idea del perché PHP abbia sollevato alcun avvertimento a riguardo.
Altri suggerimenti
Man usort
dice http://www.php.net/manual/ en / function.usort.php
.
value_compare_func
La funzione di confronto deve restituire un numero intero inferiore a, uguale a, o superiore a zero se il primo argomento è considerato rispettivamente inferiore a, uguale o superiore al secondo.
Ma la callback fornita ha solo un operatore ">
":
{
return filemtime($a) > filemtime($b);
}
.
e l'uomo dice ( http://www.php. Net / Manual / It / Language.Operars.ComParison.php ) che "maggiore di" AKA >
Operator restituisce solo true o false, ma non il numero negativo / zero / positivo, come richiesto.
.
$a > $b
maggiore del vero se $ A è strettamente maggiore di $ B.
Cosa ne pensi di usare l'operatore "Subtrizione" "-
" tra due generatori di filemtime
s, perché l'uomo dice di nuovo che filemtime
è il numero intero ( http://www.php.net/manual/en/function.filempempe.php ).
E c'è una risposta duplicata da qualche parte su questo sito (googled con Filemtime Usert e sensazione di fortunato - il primo risultato è): Ordina questo Array per data modificato? e la risposta è stata da michael berkowski , chi dice:
if (filemtime($a) === filemtime($b)) return 0;
return filemtime($a) < filemtime($b) ? -1 : 1;
.