Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Ordinare array associativo multidimensionale

    Ciao a tutti, ho un array multidimensionale come questo:


    array $friends:
    codice:
    Array ( 
    	[0] => User Object ( 
    				[id:User:private] => 6 
    				[username:User:private] => amy
    				[password:User:private] => fa7f8ff03a1b3d214913bbce87b4b1a1a95cbf79 
    				[email:User:private] => amy@gmail.com 
    				[first_name:User:private] => Amy
    				[last_name:User:private] => Ross 
    				[city:User:private] => Los Angeles 
    				[gender:User:private] => F 
    				[date:User:private] => 01/01/2000 
    		) 
    	[1] => User Object ( 
    				[id:User:private] => 12 
    				[username:User:private] => antony 
    				[password:User:private] => 1799296195846afeef14df836a5db11994803780 
    				[email:User:private] => antony@example.com 
    				[first_name:User:private] => Antony 
    				[last_name:User:private] => Hevia 
    				[city:User:private] => New York 
    				[gender:User:private] => M 
    				[date:User:private] => 01/01/2003 
    		) 
    	[2] => User Object ( 
    				[id:User:private] => 17 
    				[username:User:private] => janis 
    				[password:User:private] => e74f86fd784cbedb3cf1e4e1f685a12470fff7bc 
    				[email:User:private] => janis@example.com 
    				[first_name:User:private] => Janis 
    				[last_name:User:private] => Jane 
    				[city:User:private] => // 
    				[gender:User:private] => F 
    				[date:User:private] => ../../.... 
    		) 
    	[3] => User Object ( 
    				[id:User:private] => 19 
    				[username:User:private] => alex 
    				[password:User:private] => e74f86fd784cbedb3cf1e4e1fa5db11994803780 
    				[email:User:private] => alex@example.com 
    				[first_name:User:private] => Alex 
    				[last_name:User:private] => Smith
    				[city:User:private] => // 
    				[gender:User:private] => F 
    				[date:User:private] => ../../.... 
    		) 		
    }

    Voglio ordinare l'array secondo il campo username e first_name.


    Ho provato così:


    codice:
    $this->sort($this->friends, array('username', 'first_name'));
    
    
    public function sort($array, $cols) { 
       $colarr = array(); 
       foreach($cols as $col => $order) { 
           $colarr[$col] = array(); 
           foreach($array as $k => $row) { 
              $colarr[$col]['_'.$k] = strtolower($row[$col]);  -->line 112
           } 
       } 
       $eval = 'array_multisort('; 
       foreach($cols as $col => $order) { 
           $eval .= '$colarr[\''.$col.'\'],'.$order.','; 
       } 
       $eval = substr($eval,0,-1).');'; 
       eval($eval); 
       $ret = array(); 
       foreach($colarr as $col => $arr) { 
           foreach($arr as $k => $v) { 
               $k = substr($k,1); 
               if(!isset($ret[$k])) 
                  $ret[$k] = $array[$k]; 
               $ret[$k][$col] = $array[$k][$col]; 
           } 
       } 
       return $ret; 
    }
    Ma genera il seguente errore:


    Fatal error: Cannot use object of type User as array in ... on line 112


    Come posso risolvere?


    Altrimento ho pensato di ordinare l'array al momento della celect al database.
    Questa è la mia query:
    codice:
    $stmt = $db->prepare("SELECT * "
                    . "FROM `users` "
                    . "INNER JOIN `friend` ON (`username` = `user_req`) "
                    . "WHERE (`user_acc` = ? AND `status` = '1') "
                    . "UNION DISTINCT "
                    . "SELECT * "
                    . "FROM `users` "
                    . "INNER JOIN `friend` ON (`username` = `user_acc`) "
                    . "WHERE (`user_req` = ? AND `status` = '1')");
    Se aggiungo un ORDER BY, in questo modo, in funziona più...
    codice:
    $stmt = $db->prepare("(SELECT * "
                    . "FROM `users` "
                    . "INNER JOIN `friend` ON (`username` = `user_req`) "
                    . "WHERE (`user_acc` = ? AND `status` = '1') "
                    . "UNION DISTINCT "
                    . "SELECT * "
                    . "FROM `users` "
                    . "INNER JOIN `friend` ON (`username` = `user_acc`) "
                    . "WHERE (`user_req` = ? AND `status` = '1')) ORDER BY `username`");
    E' indifferente come viene ordinato l'array (a livello sql o php), l'importante è che sia ordinato (almeno) secondo l'username.


    Come posso fare?

  2. #2
    idee?

  3. #3
    usa http://it2.php.net/usort e fai una funzione di comparazione adeguata... usa http://it2.php.net/strcmp per fare la comparazione degli username... se sono uguali (mi chiedo come sia possibile) ritorni il strcmp dei firstname ... o cmq implementa la tua logica... il discorso di ordinare i risultati nella query è "complicato", nel senso che dovrei capire perchè tu abbia usato una union ... invece di ordinare la union potresti fare una cosa del tipo

    codice:
    select * from (select users... union ... ) order by username, first_name;
    o nell'equivalente sintassi mysql...
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.