PHP comparison

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mr Beronne

Mr Beronne

25/10/2016 20:02:20
Quote Anchor link
In php zijn er vele handige array sorteer functies. Nu kom ik er achter dat er enkele
sorteer functies user defined zijn (uasort(), uksort() en usort()), waarbij je met een
comparison je eigen sorteer functie kan maken/bepalen.

Echter snap ik dit niet helemaal hoe dit in werking gaat. Wat gebeurt er achter
de schermen. Om het te proberen te snappen ben ik met een voorbeeld bezig.

Stel ik heb de volgende array
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
$array = array(
    "c" => "ccc",
    "t" => "aaa",
    "k" => "bbb",
    "p" => "differnt",
    "u" => "www"
);


Dan wil ik bijvoorbeeld dat (ccc, aaa, bbb en www) of alfabet gezet worden en als laatste
moet differnt worden weergegeven.

Ik heb nu het volgende gedaan

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
function comparison($a, $b)
{
    if($a == $b) {return 0;}
    if(strpos($a, "differnt") === false) { return -1; }
    if(strpos($b, "differnt") === false) { return 1; }
    return ($a < $b) ? -1 : 1;
}

uasort($array, 'comparison');

// uitkomst na print
ARRAY NEW Array
(
    [c] => ccc
    [t] => aaa
    [k] => bbb
    [u] => www
    [p] => differnt
)

// Gewenste uitkomst
ARRAY GEWENST Array
(
    [t] => aaa
    [k] => bbb
    [c] => ccc
    [u] => www
    [p] => differnt
)


Ik snap dus niet helemaal hoe dit werkt.

Ik heb ondertussen de oplossing gevonden
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
function comparison($a, $b)
{
    if($a == $b) {return 0;}
    if(strpos($a, "differnt") !== false) { return 1; }
    if(strpos($b, "differnt") !== false) { return -1; }
    return ($a < $b) ? -1 : 1;
}

// uitkomst
    [t] => aaa
    [k] => bbb
    [c] => ccc
    [u] => www
    [p] => differnt


Ik ben er achter dat het kleiner dan < en groter dan > staan voor de
volgorde van sorteren. Alleen nu snap ik de 1 en -1 niet.
Gewijzigd op 25/10/2016 20:24:40 door Mr Beronne
 
PHP hulp

PHP hulp

21/11/2024 14:34:01
 
Remco nvt

Remco nvt

25/10/2016 20:35:06
Quote Anchor link
"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"
 
Mr Beronne

Mr Beronne

25/10/2016 20:47:39
Quote Anchor link
Ik lees nu ook dat de getallen het volgende betekend
0 = hetzelfde dus blijf of zelfde positie
-1 = stap naar beneden in de array
1 = stap naar boven in de array.

Ik heb de volgende test gemaakt
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 comparison($a, $b)
{
    if($a == $b) {
        echo "a ($a) is same priority as b ($b), keeping the same<br />";
        return 0;
    }
    if(strpos($a, "differnt") !== false) {
        echo "a ($a) contains the word differnt, move ($a) up the array<br />";
        return 1;
    }
    if(strpos($b, "differnt") !== false) {
        echo "b ($b) contains the word differnt, move ($b) down the array<br />";
        return -1;
    }

    if($a < $b)
    {
        echo "a ($a) is smaller than b ($b), move (b) it down the array<br />";
        return -1;
    }
    else
    {
        echo "a ($a) is greater than b ($b), move (a) it down the array<br />";
        return 1;
    }
}

// uitkomst is
a (ccc) is greater than b (aaa), move (a) it down the array
a (ccc) is greater than b (bbb), move (a) it down the array
a (aaa) is smaller than b (bbb), move (b) it down the array
a (ccc) is greater than b (bbb), move (a) it down the array
a (bbb) is same priority as b (bbb), keeping the same
b (differnt) contains the word differnt, move (differnt) down the array
a (differnt) contains the word differnt, move (differnt) up the array
a (ccc) is smaller than b (www), move (b) it down the array
a (differnt) contains the word differnt, move (differnt) up the array
a (ccc) is smaller than b (qqq), move (b) it down the array
a (www) is greater than b (qqq), move (a) it down the array


Hierdoor snap ik het nu een beetje, weet alleen nog niet zo goed hoe die die differnt nu onderaan zet
wat ook moet, maar hoe???
 
Pg Vincent

Pg Vincent

25/10/2016 20:58:42
Quote Anchor link
Het is "gewoon" een variatie op bubble-sort.

De routine lust door alle elementen van de array heen en geeft telkens dat element plus het volgende aan de vergelijkingsfunctie. De vergelijkingsfunctie zegt dan of het eerste element groter, kleiner of gelijk is aan het tweede, en op basis daarvan worden de elemeten in de array omgewisseld, of zo gelaten. Als er wordt opgewisseld dan was het eerste element groter dan het tweede, en omdat ze zijn omgewisseld is het eerste lement nu kleiner; ze zijn gesorteerd.

De routine doet dit 1x voor alle elementen, en als de vergelijking zegt dat er iets moet worden omgewisseld dan zal de routine daarna nog eens lopen. Als de vergelijker bij geen enkel element iets omwisselt dan is de array gesorteerd.

Maar zoek anders nog een tut over bubblesort, want dat is wat er hier gebeurt.
 



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.