PHP对数组进行排序
我有一个数组PHP对数组进行排序,php,arrays,sorting,Php,Arrays,Sorting,我有一个数组 $genreQuery = $con ->query ("select distinct(movie_year) from movies"); $movieGenre = array(); $movieTitle = array(); $movieList = array(); while($row = $genreQuery->fetch_object()) { $movieGenre[] = $row; } foreach($movieGenre as
$genreQuery = $con ->query ("select distinct(movie_year) from movies");
$movieGenre = array();
$movieTitle = array();
$movieList = array();
while($row = $genreQuery->fetch_object()) {
$movieGenre[] = $row;
}
foreach($movieGenre as $MGenre){
$query = $con ->query
("
select '$MGenre->movie_year' movie_year, IFNULL(count(*)/(select count(*)
from user_movie_ratings where user_id = '$userid'),0) rating
from user_movie_ratings umr,
movies m
where umr.user_id = '$userid'
and umr.movie_id = m.id
and m.movie_year = '$MGenre->movie_year' ORDER BY rating DESC;
");
while($row = $query->fetch_object()) {
$movieTitle[] = $row;
}
}
$text = "";
foreach($movieTitle as $MTitle){
if (empty($text)){
$text = "\"".$MTitle->movie_year."\"";}
else{
$text = $text.",\"".$MTitle->movie_year."\"";
}
}
$list = $con ->query
("
SELECT movie_name, avg_rating, image, id, genre
FROM movies
WHERE id NOT IN (SELECT movie_id FROM user_movie_ratings WHERE user_id = '$userid')
ORDER BY field(movie_year, $text), avg_rating DESC;
");
while($row = $list->fetch_object()) {
$movieList[] = $row;
}
数组是由上面的查询填充的,我想做的是按照评级对它进行排序,这样看起来就像这样
year rating
2014 0.0001
2015 0.0000
2013 0.0000
1967 0.0000
.... ......
.... ......
etc etc
我曾尝试通过评级DESC向查询中添加订单,但这不起作用,当我使用rsort$movieTitle时,它会按年份排序,而不是评级,我需要进行某种多维排序,或者还有其他方法吗?我想按评级排序是行不通的,因为您似乎在foreach循环中运行多个查询,并且每次迭代都有一年的时间。因此,在这种情况下,您的订单将按年份排序,然后按评级排序 您应该摆脱该循环,只执行一次查询,然后条件和排序顺序将为:
...
AND m.movie_year IN (the,years,you,want)
ORDER BY rating DESC
通过像现在这样循环使用$movieGenre,您可以很容易地生成一个逗号分隔的列表,以便在in语句中使用
编辑:根据您的注释,您需要所有年份,因此不需要查询中的foreach循环和年份条件
您可能需要以下内容:
SELECT m.movie_year, IFNULL(count(*)/(select count(*)
from user_movie_ratings where user_id = '$userid'),0) rating
FROM user_movie_ratings umr,
movies m
WHERE umr.user_id = '$userid'
AND umr.movie_id = m.id
ORDER BY rating DESC
当然,假设在查询中使用用户ID是安全的,那么您应该真正使用准备好的语句来避免潜在的sql注入
现在,您的所有结果都在一个查询中,因此不再需要外部循环。为什么不在SQL查询中应用ORDER BY子句?您的意思是ORDER BY rating DESC,我试过了,但它不起作用。请看上文,我制作了一些表,我假设这些表在功能上与您的表相同,我只是在查询的末尾添加了order,即评级desc。结果按等级从最高值到最低值排序。为了重新创建错误,我们需要知道您使用的确切列定义。可能是您做了一些非常奇怪的事情导致了这个错误。另一个查询是$genreQuery=$con->query select distinctmovie\u year from movies@这没有任何意义,如果您以任何方式选择所有年份,则无需添加年份作为条件。我已添加了上面的完整代码,我需要不同的电影年份,因此只计算一次,否则我错了。“电影年”是从一张电影表中选出的,上面有关于电影的信息,如年份、类型等on@McNoodles然后,您需要按年份对计数进行分组,并在计算分数的内部查询中进行分组。它只返回一年,而不是所有年份