Het sorteren in een bepaalde volgorde

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jorn Reed

Jorn Reed

28/06/2022 11:06:11
Quote Anchor link
Hoi, ik heb een script geschreven, die memberships ophaalt vanuit een api.
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)
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
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);
}


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.
 
PHP hulp

PHP hulp

19/08/2022 00:11:31
 
Jan Koehoorn

Jan Koehoorn

28/06/2022 12:45:01
Quote Anchor link
Hoe ziet een print_r van de array $memberships op regel 3 van je voorbeeld eruit?

Edit:

Dit soort dingen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$memberships = array_values($memberships);

zou ik nooit doen, om verwarring te voorkomen. Je kunt beter een nieuwe variablenaam verzinnen.
Gewijzigd op 28/06/2022 12:47:13 door Jan Koehoorn
 
Jorn Reed

Jorn Reed

28/06/2022 13:13:18
Quote Anchor link
Ik heb het zo kunnen oplossen.
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)
PHP script in nieuw venster Selecteer het PHP script
1
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;
    });


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.
 
Jan Koehoorn

Jan Koehoorn

28/06/2022 18:07:42
Quote Anchor link
Ok, prima. Die usort werkt nu omdat je pos_a - pos_b gebruikt, wat altijd een getal oplevert. strcmp is wat dat betreft onvoorspelbaar.
 
Jorn Reed

Jorn Reed

28/06/2022 18:09:50
Quote Anchor link
Ah oke, maar is dit verder goed, of gebruik ik nu juist verkeerde functies?
 
Jan Koehoorn

Jan Koehoorn

29/06/2022 07:10:31
Quote Anchor link
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.
 
Jorn Reed

Jorn Reed

29/06/2022 09:06:06
Quote Anchor link
Ik kreeg een 0 terug, equal to. Dus denk het wel dan inderdaad haha. Bedankt voor de uitleg!
 



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.