Net nieuw en meteen een vraag. Met de volgende code haal ik de inhoud van een folder op:
{assign var=files value="uploads/Documenten/GPS-Tracks/*.html"|glob}

<?php
$folder = '<some foldername>';
$files = array_values(preg_grep('/^([^.])/', scandir($folder, SCANDIR_SORT_ASCENDING)));
?>

De inhoud bestaat uit:
Brighton-Gosport_2108
Brighton-Littlehampton_2012
Brighton-Portmouth-Brighton_2018
Bruinisse-Herkingen_2012
BurnhamonCrouch_Vlissingen_22aug13
Calais-Dieppe_2014
Carteret-Dielette_2012
Cherbourg-StVaast_2012
Clubwedstrijd_17sept11
Clubwedstrijd_18sep10
Clubwedstrijd_21sep13
Cowes-BeauLieu_River_2012

Deze array wil ik sorteren op de laatste twee karakters en dat doe ik met:
<?php
usort(var_dump($files, function ($a, $b){
if ($a || $b <> "")
return substr($b, strlen($b) - 2) - substr($a, strlen($a) - 2);
}));
?>

En dat levert me een gesorteerd overzicht op en een warning:
[121] => string(29) "Weymouth-Lyme_Reges_2012.html"
[122]=> string(24) "Yarmouth-Poole_2012.html" }
object(Closure)#1036 (1) {["parameter"]=> array(2) { ["$a"]=> string(10) "" ["$b"]=> string(10) "" } } Warning: usort() expects exactly 2 parameters, 1 given in /Users/name/Sites/install/assets/udt/sort-on-last-characters.php on line 55

Hoe zou ik dit kunnen oplossen?

Het einddoel is een lijst waarbij per jaar de daarbij behorende bestanden worden weergegeven.

Alvast dank voor het meedenken!
Ik neem eigenlijk aan dat die var_dump() om die usort() heen moet (zodat je in beeld krijgt wat de usort er van gemaakt heeft). Zo slaat het eigenlijk helemaal nergens op ...

Dus "usort" en "var_dump" gewoon verwisselen, en de rest (incl haakjes e.d.) gewoon laten staan.
Dank je, maar helaas. Aanpassing gedaan en dat geeft de volgende melding:
Warning: A non-numeric value encountered in /Users/<username>/Sites/install/assets/udt/sort-on-last-characters.php on line 58

Code enigszins aangepast; blijkt een andere manier voor inlezen contents van een folder en ik alleen maar de naam van het bestand wil weergeven. Onderstaand de code na de voorgestelde aanpassing, maar die geeft dus de Warning.
$files = glob("$folder"."$file_name");

$sorted = var_dump(usort($files, function($a, $b) {
return substr($b, strlen($b) - 2) - substr($a, strlen($a) - 2) ? 0 : 1;
}));

foreach ((array) $sorted as $file) {
echo "Bestandsnaam " . pathinfo('$file', filename) . \n;
}
Als ik kijk naar de definitie van usort() wordt het te sorteren array ($files) inhoudelijk aangepast. De return value van usort() is een boolean die aangeeft op de operatie is geslaagd.

Als ik kijk naar de definitie van var_dump() dan retourneert deze niets (void).

Ook lijkt het mij niet zinnig om quotes om variabelen te zetten?

Als je X karakters van het einde van een string wilt hebben kun je substr() voorzien van een negatieve startpositie. Zie wederom de documentatie.

Ik zou dus eerder zoiets verwachten:
<?php
// unsorted files
$files = glob($folder.$file_name);

if (
    usort($files, function($a, $b) {
        $yearA = (int) substr($a, -2);
        $yearB = (int) substr($b, -2);
        return $yearB - $yearA; // descending, for ascending swap $yearA and $yearB
    })
) {
    // $files is now sorted, do your stuff here
    // ...
} else {
    // sorting failed, show error message, exception, etc.
}
?>

Overigens lijkt mij Brighton-Gosport_[color=#ff0000]2108[/color] niet kloppen.
@Thomas: varen brengt je vooruit in de tijd ;)

Dit script werkt deesl!
<?php
$files = glob($folder.$file_name);
if (
usort($files, function($a, $b) {
$yearA = (int) substr($a, -7); // op dit moment zit de extensie nog aan de filenaam en die meetellen in het aantal te verwijderen karakters
$yearB = (int) substr($b, -7); // idem
return $yearB - $yearA; // descending, for ascending swap $yearA and $yearB
})
) {
// $files is now sorted, do your stuff here
foreach ((array) $files as $file) {
echo basename($file, '.html');
echo "<br />";
}
// print_r($sorted);

} else {
// sorting failed, show error message, exception, etc.
echo "Files not sorted";
}
?>

Output is nu:
Eastbourne-Ramsgate_2018
Ramsgate-Eastbourne_2018
Eastbourne-Brighton_2018
Breskens-Oostende_2018
Oostende-Ramsgate_2018
East_Cowes-Eastbourne_2018
40MijlvanBru_26mei2018
Ramsgate-Blankenberge_2018
Brighton-Portmouth-Brighton_2018
StAnnaland-Herkingen_2018
28aug2015
24aug2015
22aug2015

Doel is uiteindelijk een sortering op jaar:

Tracks in 2018
- file A
- file B
- file ...
Tracks in 2017
- file E
- file F
- file G
Tracks in 2016
- file H
- file I
- file J
etc
Had je over dat laatste nu nog een vraag of gaat dit verder lukken?
De lay-out gaat me lukken. Wel nog een vraag over het vervangen van de - en de _ door spaties. Dit geprobeerd met str_replace(), maar die vindt dat $file een array is en doet daarom geen wijziging doorvoeren. Is er een commando waarmee ik vooraf alle - en _ kan vervangen zodanig dat ik dit maar een keer hoef te doen i.p.v. in elke 'loop' dit te herhalen?
Probeer het eens met array_map().
<?php
function mySpaces($in) {
    return str_replace(array('-', '_'), ' ', $in);
}

$myArray = array_map('mySpaces', $myArray);
?>

Verder niet getest, maar het idee moge duidelijk zijn.
str_replace kan prima omgaan met arrays. Heb je de functie niet op de verkeerde plek gezet? Doe dit buiten de loops.
<?php
$files = str_replace(array('-','_'), ' ', $files); // Vervang - en _ door spatie.
?>
Michael - op 23/08/2018 17:26:03

str_replace kan prima omgaan met arrays. Heb je de functie niet op de verkeerde plek gezet? Doe dit buiten de loops.
<?php
$files = str_replace(array('-','_'), ' ', $files); // Vervang - en _ door spatie.
?>

Deze doet het helemaal. Top.

Dank beiden voor het meedenken!
Michael - op 23/08/2018 17:26:03
str_replace kan prima omgaan met arrays.

Cool, was mij nooit opgevallen, da's idd makkelijker dan.

Reageren