usort warning bij sorteren op laatste twee karakters
{assign var=files value="uploads/Documenten/GPS-Tracks/*.html"|glob}
Code (php)
1
2
3
4
2
3
4
<?php
$folder = '<some foldername>';
$files = array_values(preg_grep('/^([^.])/', scandir($folder, SCANDIR_SORT_ASCENDING)));
?>
$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)
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!
Dus "usort" en "var_dump" gewoon verwisselen, en de rest (incl haakjes e.d.) gewoon laten staan.
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
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:
Overigens lijkt mij Brighton-Gosport_2108 niet kloppen.
Als ik kijk naar de definitie van 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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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.
}
?>
// 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
Dit script werkt deesl!
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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";
}
?>
$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
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?
array_map().
Verder niet getest, maar het idee moge duidelijk zijn.
Probeer het eens met Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
function mySpaces($in) {
return str_replace(array('-', '_'), ' ', $in);
}
$myArray = array_map('mySpaces', $myArray);
?>
function mySpaces($in) {
return str_replace(array('-', '_'), ' ', $in);
}
$myArray = array_map('mySpaces', $myArray);
?>
Verder niet getest, maar het idee moge duidelijk zijn.
Code (php)
1
2
3
2
3
<?php
$files = str_replace(array('-','_'), ' ', $files); // Vervang - en _ door spatie.
?>
$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.
Code (php)
1
2
3
2
3
<?php
$files = str_replace(array('-','_'), ' ', $files); // Vervang - en _ door spatie.
?>
$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.