PHP comparison
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)
1
2
3
4
5
6
7
2
3
4
5
6
7
$array = array(
"c" => "ccc",
"t" => "aaa",
"k" => "bbb",
"p" => "differnt",
"u" => "www"
);
"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)
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
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
)
{
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
{
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
"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"
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)
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 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
{
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???
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.