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
.

È stato utile?

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 filemtimes, 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; 
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top