Multidimensionale array sorteren met getallen voor tekst
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Array
(
[0] => Array
(
[0]=> 2
[1] => Klaas
)
[1] => Array
(
[0] => DNF
[1] => Piet
)
[2] => Array
(
[0] => 1
[1] => Jan
[3] => Array
(
[0] => 10
[1] => Henk
)
)
(
[0] => Array
(
[0]=> 2
[1] => Klaas
)
[1] => Array
(
[0] => DNF
[1] => Piet
)
[2] => Array
(
[0] => 1
[1] => Jan
[3] => Array
(
[0] => 10
[1] => Henk
)
)
Daarvan wil ik de value 0 sorteren, in volgorde 1-2-10-DNF. Onderstaande functie werkt bijna perfect, alleen komt dan de tekst als eerste. Ik heb wel gevonden om op string te sorteren, maar dan komt 10 voor 2. Weet iemand hoe ik dit oplos?
Gewijzigd op 26/09/2016 21:28:53 door G Jansma
Antwoord zie hier
EDIT:
Door het voorbeeld op jouw situatie toe te passen krijg je het volgende.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
$array = Array (
Array(2,'Klaas'),
Array('DNF','Piet'),
Array(1,'Jan'),
Array(10,'Henk'),
);
foreach ($array as $key => $row) {
$col[$key] = $row[0];
}
array_multisort($col, SORT_ASC, SORT_NATURAL, $array);
Array(2,'Klaas'),
Array('DNF','Piet'),
Array(1,'Jan'),
Array(10,'Henk'),
);
foreach ($array as $key => $row) {
$col[$key] = $row[0];
}
array_multisort($col, SORT_ASC, SORT_NATURAL, $array);
Output
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
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
Array
(
[0] => Array
(
[0] => 1
[1] => Jan
)
[1] => Array
(
[0] => 2
[1] => Klaas
)
[2] => Array
(
[0] => 10
[1] => Henk
)
[3] => Array
(
[0] => DNF
[1] => Piet
)
)
(
[0] => Array
(
[0] => 1
[1] => Jan
)
[1] => Array
(
[0] => 2
[1] => Klaas
)
[2] => Array
(
[0] => 10
[1] => Henk
)
[3] => Array
(
[0] => DNF
[1] => Piet
)
)
Gewijzigd op 27/09/2016 00:43:37 door Michael -
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
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
<?php
usort($arr, function ($a, $b)
{
// $a en $b zijn nog array's waarvan we de 0 index enkel gebruiken dus daarom even omzetten
$a = $a[0];
$b = $b[0];
// ctype_digit kijkt of de inhoud van de string numeriek is
$aIsDigit = ctype_digit($a);
$bIsDigit = ctype_digit($b);
// indien één van beide numeriek is dan gaat deze voor
if($aIsDigit xor $bIsDigit)
{
return $aIsDigit ? -1 : 1;
}
// indien ze beiden numeriek zijn dan gaat de laagste voor
elseif($aIsDigit and $bIsDigit)
{
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
// beiden tekst? sorteer dan alfabetisch. Je kunt ook stricmp gebruiken als je geen onderscheid wilt maken tussen hoofdletters en kleine letters!
return strcmp($a, $b);
});
?>
usort($arr, function ($a, $b)
{
// $a en $b zijn nog array's waarvan we de 0 index enkel gebruiken dus daarom even omzetten
$a = $a[0];
$b = $b[0];
// ctype_digit kijkt of de inhoud van de string numeriek is
$aIsDigit = ctype_digit($a);
$bIsDigit = ctype_digit($b);
// indien één van beide numeriek is dan gaat deze voor
if($aIsDigit xor $bIsDigit)
{
return $aIsDigit ? -1 : 1;
}
// indien ze beiden numeriek zijn dan gaat de laagste voor
elseif($aIsDigit and $bIsDigit)
{
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
// beiden tekst? sorteer dan alfabetisch. Je kunt ook stricmp gebruiken als je geen onderscheid wilt maken tussen hoofdletters en kleine letters!
return strcmp($a, $b);
});
?>
Toevoeging op 26/09/2016 23:48:21:
@michael: Waarom
???
@Frank, Omdat in het voorbeeld dat ik in het andere topic had gegeven de key in stand moest blijven. In dit geval zou het niet nodig zijn dus heb het antwoord aangepast.