Het sorteren in een bepaalde volgorde
De api returned een hoop memberships, maar ik hoef er maar een paar te tonen aan de hand van welke duration je kiest.
Dit werkt ook gewoon, overigens haal ik ook de '1' uit de membership namen. Vervolgens zijn er nog wat handelingen die allemaal werken, alleen krijgen ik het sorteren niet aan de praat.
Ik wil zeg maar de volgende volgordes voor elkaar krijgen:
Flexibel:
'Pay Per Week'
1 jaar:
'Smart Choice', 'Smart Duo'
2 jaar:
'Smart Choice 2jr', 'Smart Duo 2jr'
Hier is de code die ik gebruik
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function get_memberships(){
$location_id = htmlspecialchars(trim($_GET['location_id']));
$memberships = (new SportivityClient($location_id))->getMemberships();
// wp_send_json($memberships);
$duration = htmlspecialchars(trim($_GET['duration']));
$memberships = array_filter($memberships, function($mem) use ($duration) {
switch($duration){
case 'Flexibel':
return in_array($mem['Description'], ["Pay Per Week 1"]);
case '1 Jaar':
return in_array($mem['Description'], ["Smart Choice 1", "Smart Duo 1"]);
case '2 Jaar':
return in_array($mem['Description'], ["Smart Choice 2jr 1", "Smart Duo 2jr 1"]);
}
});
$memberships = array_values($memberships);
$savedMemberships = function_exists('getSavedMemberships') ? getSavedMemberships() : [];
foreach($memberships as $key => $value){
$memberships[$key]['Description'] = rtrim($memberships[$key]['Description'], '1');
if($memberships[$key]['Action'] == true){
$savedMembershipKey = array_search($memberships[$key]['Description'], array_column($savedMemberships, 'title'));
if ($savedMembershipKey === false) {
continue;
}
$memberships[$key]['OriginalPrice'] = $savedMemberships[$savedMembershipKey]['normalPrice'];
}
}
$order = [['Description' => 'Pay Per Week'], ['Description' => 'Smart Choice'], ['Description' => 'Smart Choice 2jr'], ['Description' => 'Smart Duo', 'Smart Duo 2jr']];
usort($memberships, function (array $a, array $b) use ($order) {
$pos_a = array_search($a['Description'], $order);
$pos_b = array_search($b['Description'], $order);
return strcmp($pos_a, $pos_b);
});
wp_send_json($memberships);
}
$location_id = htmlspecialchars(trim($_GET['location_id']));
$memberships = (new SportivityClient($location_id))->getMemberships();
// wp_send_json($memberships);
$duration = htmlspecialchars(trim($_GET['duration']));
$memberships = array_filter($memberships, function($mem) use ($duration) {
switch($duration){
case 'Flexibel':
return in_array($mem['Description'], ["Pay Per Week 1"]);
case '1 Jaar':
return in_array($mem['Description'], ["Smart Choice 1", "Smart Duo 1"]);
case '2 Jaar':
return in_array($mem['Description'], ["Smart Choice 2jr 1", "Smart Duo 2jr 1"]);
}
});
$memberships = array_values($memberships);
$savedMemberships = function_exists('getSavedMemberships') ? getSavedMemberships() : [];
foreach($memberships as $key => $value){
$memberships[$key]['Description'] = rtrim($memberships[$key]['Description'], '1');
if($memberships[$key]['Action'] == true){
$savedMembershipKey = array_search($memberships[$key]['Description'], array_column($savedMemberships, 'title'));
if ($savedMembershipKey === false) {
continue;
}
$memberships[$key]['OriginalPrice'] = $savedMemberships[$savedMembershipKey]['normalPrice'];
}
}
$order = [['Description' => 'Pay Per Week'], ['Description' => 'Smart Choice'], ['Description' => 'Smart Choice 2jr'], ['Description' => 'Smart Duo', 'Smart Duo 2jr']];
usort($memberships, function (array $a, array $b) use ($order) {
$pos_a = array_search($a['Description'], $order);
$pos_b = array_search($b['Description'], $order);
return strcmp($pos_a, $pos_b);
});
wp_send_json($memberships);
}
Als iemand me zou kunnen helpen met het sorteren zou dat heel fijn zijn. Dit is namelijk echt een php onderdeel waar ik vaak tegen aan loop omdat ik het best verwarrend vind.
Per locatie heb je een andere api token, en op sommige locaties hadden ze de abonnementen in andere volgordes toegevoegd. Heb alle locaties nagelopen met dit stukje code
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
$order = ['Pay Per Week', 'Smart Choice', 'Smart Choice 2jr', 'Smart Duo', 'Smart Duo 2jr'];
usort($memberships, function (array $a, array $b) use ($order) {
$pos_a = array_search($a['Description'], $order);
$pos_b = array_search($b['Description'], $order);
return $pos_a - $pos_b;
});
usort($memberships, function (array $a, array $b) use ($order) {
$pos_a = array_search($a['Description'], $order);
$pos_b = array_search($b['Description'], $order);
return $pos_a - $pos_b;
});
Alles lijkt zo te kloppen.
Verder om terug te komen op je advies om niet `$memberships = array_values($memberships)` te doen.
Ik filter het hele api object, ik haal alleen de memberships er uit die ik nodig heb. Dan heb je dus bijv een array met `3, 5, 17, 40` als keys voor de memberships. Ik stuur vervolgens alle memberships door naar javascript, en daar loop ik door ze heen. Maar als ik array_values niet gebruik, denk JS door de willekeurige keys dat het een object is i.p.v. een array. Daarom reset ik de keys op die manier.
Ok, prima. Die usort werkt nu omdat je pos_a - pos_b gebruikt, wat altijd een getal oplevert. strcmp is wat dat betreft onvoorspelbaar.
Ah oke, maar is dit verder goed, of gebruik ik nu juist verkeerde functies?
Jorn Reed op 28/06/2022 18:09:50:
Ah oke, maar is dit verder goed, of gebruik ik nu juist verkeerde functies?
Uit het PHP manual:
Quote:
The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.
Zolang je dus maar een expressie of een compare functie gebruikt die een int, kleiner, gelijk aan, of groter dan 0 returnt zit je goed.
Ik kreeg een 0 terug, equal to. Dus denk het wel dan inderdaad haha. Bedankt voor de uitleg!