usort warning bij sorteren op laatste twee karakters

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Uisge Beatha

Uisge Beatha

22/08/2018 07:11:14
Quote Anchor link
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}

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?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!
 
PHP hulp

PHP hulp

24/04/2024 14:50:48
 
Rob Doemaarwat

Rob Doemaarwat

22/08/2018 08:12:59
Quote Anchor link
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.
 
Uisge Beatha

Uisge Beatha

22/08/2018 09:09:22
Quote Anchor link
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;
}
Gewijzigd op 22/08/2018 09:11:29 door Uisge Beatha
 
Thomas van den Heuvel

Thomas van den Heuvel

22/08/2018 15:24:32
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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_2108 niet kloppen.
Gewijzigd op 22/08/2018 15:25:04 door Thomas van den Heuvel
 
Uisge Beatha

Uisge Beatha

22/08/2018 15:44:49
Quote Anchor link
@Thomas: varen brengt je vooruit in de tijd ;)

Dit script werkt deesl!
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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
Gewijzigd op 22/08/2018 18:52:01 door Uisge Beatha
 
Thomas van den Heuvel

Thomas van den Heuvel

23/08/2018 16:27:04
Quote Anchor link
Had je over dat laatste nu nog een vraag of gaat dit verder lukken?
 
Uisge Beatha

Uisge Beatha

23/08/2018 16:43:04
Quote Anchor link
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?
 
Thomas van den Heuvel

Thomas van den Heuvel

23/08/2018 16:58:08
Quote Anchor link
Probeer het eens met array_map().
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
function mySpaces($in) {
    return str_replace(array('-', '_'), ' ', $in);
}


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

Verder niet getest, maar het idee moge duidelijk zijn.
 
Michael -

Michael -

23/08/2018 17:26:03
Quote Anchor link
str_replace kan prima omgaan met arrays. Heb je de functie niet op de verkeerde plek gezet? Doe dit buiten de loops.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$files
= str_replace(array('-','_'), ' ', $files); // Vervang - en _ door spatie.
?>
 
Uisge Beatha

Uisge Beatha

23/08/2018 20:45:22
Quote Anchor link
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$files
= str_replace(array('-','_'), ' ', $files); // Vervang - en _ door spatie.
?>

Deze doet het helemaal. Top.

Dank beiden voor het meedenken!
 
Thomas van den Heuvel

Thomas van den Heuvel

23/08/2018 23:58:25
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.