Avatar billede hoppe11 Nybegynder
01. december 2009 - 10:37 Der er 8 kommentarer og
1 løsning

sortere multidimensionelt array

hej

jeg forsøger at sortere et multidimensionelt array, men kan ikke få det til at fungere

jeg vil sortere alfabetisk efter "name"

function cmp($a, $b)
{
    $al = strtolower($a['name']);
    $bl = strtolower($b['name']);
   
    if($al == $bl) return 0;
    else return ($al > $bl) ? 1:-1;
}

usort($arr, 'cmp');

Array
        (
            [120] => Array
                (
                    [name] => Slazenger pink cap
                    [num] => 5
                )

            [122] => Array
                (
                    [name] => Returvarer til export
                    [num] => 1
                )

            [115] => Array
                (
                    [name] => Hagl til luftgevær 5,5 mm
                    [num] => 1
                )

            [118] => Array
                (
                    [name] => Gamo luftpistol 4,5
                    [num] => 2
                )

            [114] => Array
                (
                    [name] => Gamo hagl 4,5 mm
                    [num] => 4
                )

            [112] => Array
                (
                    [name] => Gamo luftgevær 4,5 mm
                    [num] => 1
                )

            [113] => Array
                (
                    [name] => Luftgevær 4,5 mm
                    [num] => 1
                )

            [117] => Array
                (
                    [name] => Gamo Shadow 1000 luftgevær
                    [num] => 1
                )
Avatar billede norsgaard Nybegynder
01. december 2009 - 11:55 #1
Tror du kan bruge denne function taget fra php.net - ksort :

function sksort(&$array, $subkey="id", $sort_ascending=false) {

    if (count($array))
        $temp_array[key($array)] = array_shift($array);

    foreach($array as $key => $val){
        $offset = 0;
        $found = false;
        foreach($temp_array as $tmp_key => $tmp_val)
        {
            if(!$found and strtolower($val[$subkey]) > strtolower($tmp_val[$subkey]))
            {
                $temp_array = array_merge(    (array)array_slice($temp_array,0,$offset),
                                            array($key => $val),
                                            array_slice($temp_array,$offset)
                                          );
                $found = true;
            }
            $offset++;
        }
        if(!$found) $temp_array = array_merge($temp_array, array($key => $val));
    }

    if ($sort_ascending) $array = array_reverse($temp_array);

    else $array = $temp_array;
}

Burde virke med sksort($array, "name", true).
Avatar billede michael_stim Ekspert
01. december 2009 - 11:56 #2
Avatar billede norsgaard Nybegynder
01. december 2009 - 11:57 #3
Skal lige siges at det ser ud som om, at du mister dine tal værdier i arrayet, altså 120, 122 osv.
Avatar billede hoppe11 Nybegynder
01. december 2009 - 13:04 #4
@ michael
det er der jeg har eksemplet fra

@ norsgaard
arrayet bliver slet ikke sorteret når jeg efterfølgende smidet det i en print_r()
Avatar billede michael_stim Ekspert
01. december 2009 - 13:14 #5
Men du skal gå længere ned til mutiarray:

<?php
function cmp($a, $b)
{
    return strcmp($a["fruit"], $b["fruit"]);
}

$fruits[0]["fruit"] = "lemons";
$fruits[1]["fruit"] = "apples";
$fruits[2]["fruit"] = "grapes";

usort($fruits, "cmp");

while (list($key, $value) = each($fruits)) {
    echo "\$fruits[$key]: " . $value["fruit"] . "\n";
}
?>
Avatar billede norsgaard Nybegynder
01. december 2009 - 13:25 #6
Prøvede lige lokalt med følgende :

<?php
   
function sksort(&$array, $subkey, $sort_ascending=false) {
    if (count($array))
        $temp_array[key($array)] = array_shift($array);
   
    foreach($array as $key => $val){
       
        $offset = 0;
        $found = false;
        foreach($temp_array as $tmp_key => $tmp_val)
        {
            if(!$found and strtolower($val[$subkey]) > strtolower($tmp_val[$subkey]))
            {
                $temp_array = array_merge(    (array)array_slice($temp_array,0,$offset),
                                            array($key => $val),
                                            array_slice($temp_array,$offset)
                                          );
                $found = true;
            }
            $offset++;
        }
        if(!$found) $temp_array = array_merge($temp_array, array($key => $val));
       
       
    }

    if ($sort_ascending) $array = array_reverse($temp_array);

    else $array = $temp_array;
}



$arr = Array
            (
            "120" => Array
                (
                    "name" => "Blazenger pink cap",
                    "num" => "5"
                ),

            "122" => Array
                (
                    "name" => "Returvarer til export",
                    "num" => "1"
                ),

            "115" => Array
                (
                    "name" => "Tagl til luftgevær 5,5 mm",
                    "num" => "1"
                ),

            "118" => Array
                (
                    "name" => "Gamo luftpistol 4,5",
                    "num" => "2"
                )
            );
                print_r($arr);
                echo "<br/>";
                sksort($arr, "name", true);
                print_r($arr);
             
?>

og fik følgende i output :

Array ( [120] => Array ( [name] => Blazenger pink cap [num] => 5 ) [122] => Array ( [name] => Returvarer til export [num] => 1 ) [115] => Array ( [name] => Tagl til luftgevær 5,5 mm [num] => 1 ) [118] => Array ( [name] => Gamo luftpistol 4,5 [num] => 2 ) )
Array ( [0] => Array ( [name] => Blazenger pink cap [num] => 5 ) [1] => Array ( [name] => Gamo luftpistol 4,5 [num] => 2 ) [2] => Array ( [name] => Returvarer til export [num] => 1 ) [3] => Array ( [name] => Tagl til luftgevær 5,5 mm [num] => 1 ) )

Så her ser det ud til at den har sorteret der. Ved ikke om du kan bruge det til noget, men det kan vel være et skridt i den rigtige retning...
Avatar billede hoppe11 Nybegynder
01. december 2009 - 15:58 #7
smid et svar norsgaard :)
Avatar billede norsgaard Nybegynder
01. december 2009 - 16:03 #8
Glad I could help.
Avatar billede hoppe11 Nybegynder
01. december 2009 - 16:44 #9
tak for hjælpen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester