Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP对数组进行排序_Php_Arrays_Sorting - Fatal编程技术网

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然后,您需要按年份对计数进行分组,并在计算分数的内部查询中进行分组。它只返回一年,而不是所有年份