Avatar billede spectrenectar Nybegynder
07. december 2008 - 20:30 Der er 3 kommentarer og
1 løsning

Benytte array_multisort til at sub sortere.

Goddag

Jeg forsøger at lave mig en multi-kolonne-liste med flere ting der kan sorteres efter. Den ser sådan her ud:


USER    AGE ONLINE
niels    22 no
hans    34 no
Camilla  18 no
Jeppe    18 yes
Klaus    50 no
Anne    18 no
Tina    18 yes


Den skal så kunne sortes efter f.eks ONLINE, AGE og så USER:


USER    AGE ONLINE
Jeppe    18 yes
Tina    18 yes
Anne    18 no
Camilla  18 no
niels    22 no
hans    34 no
Klaus    50 no


Til det har jeg brugt array_multisort. Men det duer bare ikke.
Mit kald af funktionen ser således ud:

$a = array();
       
        foreach($sort_list_users_classes as $key => $obj) {
           
            $a[] = $obj -> getSORTarr();
           
        }
       
        $a_list_num = count($a);
       
       
        if($a_list_num>0) {
            switch($a_list_num) {
                case 1:
                    array_multisort($a[0]);
                break;
                case 2:
                    array_multisort($a[0], $a[1]);
                break;
                case 3:
                    array_multisort($a[0], $a[1], $a[2]);
                break;
                case 4:
                    array_multisort($a[0], $a[1], $a[2], $a[3]);
                break;
                case 5:
                default:
                    array_multisort($a[0], $a[1], $a[2], $a[3], $a[4]);
                break;
            }
        } else echo "Hva' hulen!";

Mine klasser arver fra sortListItem som ser sådan her ud:

class SortListItem {
       
        var $type, $data, $vals, $sortValArr, $echoValArr;
       
        function SortListItem($type, $data) {
           
            $this -> type = $type;
            $this -> data = $data;
            $this -> vals = array();
           
            $this -> sortValArr = array();
            $this -> echoValArr = array();
           
        }
       
        function getTYPE() {
            return $this -> type;
        }
       
        function getSORTarr() {
            return $this -> sortValArr;
        }
       
        function getSORTitem($id) {
            return $this -> sortValArr[$id];
        }
       
        function getECHOarr() {
            return $this -> echoValArr;
        }
       
        function getECHOitem($id) {
            return $this -> echoValArr[$id];
        }
       
        function initArrays($idArr) {
            $foo = "bar";
        }
       
       
    }

Et eksempel på en child klasse er sortListOnline:

class SortListOnline extends SortListItem {
       
        var $type, $data, $vals, $sortValArr, $echoValArr;
       
        function SortListOnline($data) {
           
            parent :: SortListItem("online", $data);
           
        }
       
        function initArrays($idArr) {
           
            $user_online_tab = $this -> data -> getTable("user_online");
           
            foreach($user_online_tab as $rows) {
                foreach($idArr as $id) {
                   
                    if($rows["user_id"]==$id) {
                        $this -> sortValArr["key_$id"] = 0;
                        $this -> echoValArr["key_$id"] = "<span style=\"color:#00ff00;font-weight:bold;\">JA</span>";
                    }
                   
                }
            }
           
            foreach($idArr as $id) {
                if(!isset($this -> sortValArr["key_$id"])) {
                    $this -> sortValArr["key_$id"] = 1;
                    $this -> echoValArr["key_$id"] = "<span style=\"color:#ff0000;font-weight:bold;\">NEJ</span>";
                }
            }
           
        }
       
    }

Kun den første af de kolonner der er i brug bliver sorteret. Dvs. jeg kan sortere efter alle tre men ikke subsortere efter nogle af dem.

Hvad skal der ændres ved?

Tak


Forresten ser mine echos sådan her ud:

$mykeys = array_keys($a[0]);

foreach($mykeys as $keykeykey) {
    echo "\t<tr>\n";
   
    echo "\t\t<td style=\"background:".$color1.";text-align:right;border-left:1px solid #000000;\">".$i."</td>\n";
    echo "\t\t<td style=\"background:#66cc99;border-left:1px solid #000000;\">&nbsp;</td>\n";
   
    $j= 2;
   
    foreach($sort_list_users_cols as $val2) {
        if($col_exists[$val2]) {
           
            foreach($sort_list_users_classes as $obj) {
                if($obj -> getTYPE() == $val2) {
                    $color3 = ($j % 2 == 0) ? $color2 : $color1;
                    $value2echo = $obj -> getECHOitem($keykeykey);
                    if(trim($value2echo)=="") $value2echo = "&nbsp;";
                    echo "\t\t<td style=\"background:".$color3.";border-left:1px solid #000000;\">".$value2echo."</td>\n";
                   
                    $j++;
                }
            }
           
        }
    }
   
    echo "\t\t<td style=\"border-left:1px solid #000000;\">&nbsp;</td>\n";
   
    echo "\t</tr>\n";
    $i++;
    $color3 = $color1;
    $color1 = $color2;
    $color2 = $color3;
}
Avatar billede jakobdo Ekspert
08. december 2008 - 09:24 #1
Nu har jeg ikke gide at kigge hele din kode igennem.

Men er det ikke noget i denne stil du søger:

<?php
//http://www.eksperten.dk/spm/855631

$users = array(
    array('user' => 'Niels'  ,'age' => 22,'online'=>'no'),
    array('user' => 'Hans'  ,'age' => 34,'online'=>'no'),
    array('user' => 'Camilla','age' => 18,'online'=>'no'),
    array('user' => 'Jeppe'  ,'age' => 18,'online'=>'yes'),
    array('user' => 'Klaus'  ,'age' => 50,'online'=>'no'),
    array('user' => 'Anne'  ,'age' => 18,'online'=>'no'),
    array('user' => 'Tina'  ,'age' => 18,'online'=>'yes')
);

foreach($users as $key => $user) {
    $userA[$key]  = $user['user'];
    $ageA[$key]    = $user['age'];
    $onlineA[$key] = $user['online'];
}

array_multisort($onlineA, SORT_DESC, $ageA, SORT_ASC, $userA, SORT_ASC, $users);

echo '<pre>';
print_r($users);
echo '</pre>';
?>

Resultat kan ses her: http://www.codebreaker.dk/leg/855631.php
Avatar billede spectrenectar Nybegynder
08. december 2008 - 23:24 #2
Du skal have mange tak for din kommentar, hvad med et svar? ;)
Avatar billede jakobdo Ekspert
09. december 2008 - 08:04 #3
Svar!
Avatar billede jakobdo Ekspert
10. december 2008 - 06:30 #4
Takker for point.
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