Avatar billede Slettet bruger
16. april 2008 - 13:54 Der er 12 kommentarer og
1 løsning

Sort et multi-array

Hej eksperter.
Jeg har et array, hvor jeg gerne vil ha' soteret på feltet 'name':

Output:
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Cafe / Bar / Klubber
        )

    [1] => Array
        (
            [id] => 5
            [name] => Service
        )

    [2] => Array
        (
            [id] => 3
            [name] => Shopping
        )

    [3] => Array
        (
            [id] => 4
            [name] => Uddannelse
        )

    [4] => Array
        (
            [id] => 2
            [name] => Wellness / Skønhed
        )

    [5] => Array
        (
            [id] => All
            [name] => Alle
        )

    [6] => Array
        (
            [id] => shop
            [name] => Shops
        )

    [7] =>
)
Avatar billede pidgeot Nybegynder
16. april 2008 - 14:01 #1
http://dk2.php.net/usort

Eksempel 2 gør faktisk netop det du efterspørger - bare med et andet key-name.
Avatar billede fant0mas Nybegynder
16. april 2008 - 14:06 #2
<?
$arr = array();
$arr[] = array(id=>1, 'name' =>'pony');
$arr[] = array(id=>2, 'name' =>'hest');
$arr[] = array(id=>3, 'name' =>'hund');
$arr[] = array(id=>4, 'name' =>'giraf');

function msort($array, $id="id") {
        $temp_array = array();
        while(count($array)>0) {
            $lowest_id = 0;
            $index=0;
            foreach ($array as $item) {
                if (isset($item[$id]) && $array[$lowest_id][$id]) {
                    if ($item[$id]<$array[$lowest_id][$id]) {
                        $lowest_id = $index;
                    }
                }
                $index++;
            }
            $temp_array[] = $array[$lowest_id];
            $array = array_merge(array_slice($array, 0,$lowest_id), array_slice($array, $lowest_id+1));
        }
        return $temp_array;
    }
var_dump(msort($arr,'name'));
?>
Avatar billede Slettet bruger
16. april 2008 - 14:13 #3
Pidgeot> Det er kun ved 1 ting i arrayet og ikke 2 som mit er med (id & name)

fant0mas> Hvordan får vi den så til at sortere efter bogstaver (alfabetisk) ?
Avatar billede fant0mas Nybegynder
16. april 2008 - 14:21 #4
Har du prøvet? :)
Vi siger den skal sortere multiarray $arr efter name:
msort($arr,'name');
Avatar billede pidgeot Nybegynder
16. april 2008 - 14:28 #5
Hvad eksemplet angår, så er der ingen forskel på om der er et, to, eller flere elementer i det array, fordi usort kigger på elementerne i det overordnede array - du skal bare skrive "name" i stedet for "fruit" i den funktion, fordi det er name du sammenligner på.

(evt. kan du bruge uasort - stort set samme kode, bortset lige fra det ekstra a - check selv dokumentationen for hvilken der passer bedst til dit behov)
Avatar billede Slettet bruger
16. april 2008 - 14:35 #6
pidgeot>
Warning: usort() [function.usort]: Invalid comparison function.
Warning: uasort() [function.uasort]: Invalid comparison function.

uasort($data2, "name");
Avatar billede Slettet bruger
16. april 2008 - 14:46 #7
Mig der fik lavet en fejl.
$data2[] = array["id" => 1, "name" => "Cafe / Bar / Klubber"];
$data2[] = array["id" => "all", "name" => "Alle"];
$data2[] = array["id" => "shops", "name" => "Shops"];
$data2[] = array["id" => 2, "name" => "Wellness / Skønhed"];
$data2[] = array["id" => 3, "name" => "Shopping"];

function cmp($a, $b)
{
    return strcmp($a["name"], $b["name"]);
}
uasort($data2, "cmp");
Avatar billede Slettet bruger
16. april 2008 - 14:47 #8
Output:
Det samme som tidligere nævnt.
Avatar billede pidgeot Nybegynder
16. april 2008 - 14:55 #9
http://birdiesoft.dk/exp828067.php

Kildekode vist forneden. Kan derfor ikke rigtigt gennemskue hvorfor det skulle give fejl... hvis vi ignorerer at det skal være array() og ikke array[].
Avatar billede Slettet bruger
16. april 2008 - 15:07 #10
Ja okay nu virker noget af det.
Når jeg så kører min for() så har den ikke byttet om på dem.

for($i=0; $i<count($data2); $i++) {
echo $data2[$i]['name']."<br />";
}
Avatar billede pidgeot Nybegynder
16. april 2008 - 15:11 #11
Det er så der du har forskellen på usort og uasort - uasort bevarer indekses, det gør usort ikke. Tjek linket igen, hvor jeg har forsøgt at vise forskellen (og samtidigt viser hvordan foreach opfører sig).
Avatar billede Slettet bruger
16. april 2008 - 15:46 #12
Smider du et svar pidgeot?
Avatar billede pidgeot Nybegynder
16. april 2008 - 15:47 #13
Værsgo :)
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