[英]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.