繁体   English   中英

我必须对多维关联数组进行排序,但是我的方法不起作用

[英]I have to sort a multi-dimensional associative array, my method doesn't work

我有一个像这样的多维关联数组:

array $ friends:数组(

    [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] => ../../.... 

        )       

}

我想根据用户名字段和first_name对数组进行排序。 我尝试了这个:

        $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; 
       }

但是会产生以下错误:

致命错误:无法在第112行的...中将类型为user的对象用作数组

我该如何解决?

否则,我以为我会在Celect数据库时对数组进行排序。 这是我的查询:

    $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子句,则查询将不再起作用

    $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`"); 

无论数组如何排序(在sql或php上),按用户名排序都是很重要的。

我能怎么做? 谢谢


我在phpmyadmin上尝试了此查询,并产生以下错误: #1060-重复的列名'id'

    SELECT * 
    FROM (  SELECT * FROM users 
            INNER JOIN friend ON (username = user_req) 
            WHERE (user_acc = 'LP' AND status = 1) 
                UNION DISTINCT 
            SELECT * 
            FROM users
            INNER JOIN friend ON (username = user_acc) 
            WHERE (user_req = 'LP' AND status = 1)) fr 
    ORDER BY fr.username DESC

您可以在SQL中执行此操作。 一种方法是使用子查询,例如:

$stmt = $db->prepare("SELECT * FROM ( "
. "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') "
. ") AS allUsersAfterUnion ORDER BY username");  

要在sql中对其进行排序,请执行以下操作(只需添加SELECT * FROM ):

$stmt = $db->prepare("SELECT * FROM (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`");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM