Multidimensionale array sorteren met getallen voor tekst

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

G Jansma

G Jansma

26/09/2016 21:28:02
Quote Anchor link
Ik heb de volgende array:

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
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
        )
)


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?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
usort($arr, function ($a, $b) {
return $a[0] - $b[0];
});
Gewijzigd op 26/09/2016 21:28:53 door G Jansma
 
PHP hulp

PHP hulp

02/12/2024 21:42:17
 
Michael -

Michael -

26/09/2016 22:49:56
Quote Anchor link
Duplicate.
Antwoord zie hier

EDIT:

Door het voorbeeld op jouw situatie toe te passen krijg je het volgende.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);


Output
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
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
        )

)
Gewijzigd op 27/09/2016 00:43:37 door Michael -
 
Frank Nietbelangrijk

Frank Nietbelangrijk

26/09/2016 23:32:31
Quote Anchor link
Je zult dan eerst moeten bepalen of array index 0 een string (tekst) is of dat deze numeriek is. Aan de hand daarvan zul je dan moeten bepalen welke vergelijking je maakt.

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
<?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);
});

?>


Toevoeging op 26/09/2016 23:48:21:

@michael: Waarom
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach($array AS $val){
    $arraysorted[] = $val;
}

?>

???
 
Michael -

Michael -

27/09/2016 00:41:27
Quote Anchor link
@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.
 



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.