繁体   English   中英

按值对数组排序,然后在这些值内随机分组,但将某些元素分组-还是修改MySQL查询以将所有元素组合在一起?

[英]Sort array by value, then randomly within those values BUT group certain elements - or revise MySQL query to combine it all?

因此,假设我要按以下顺序对数组进行排序:1)按total_weight排序2)在这些权重内随机排序3)如果在相同权重内有一个名称相似的项目,请将这些项目分组

这将导致如下所示:

name: Delta 1 - total_weight: 5
name: Delta 1b - total_weight: 5
name: Charlie 12 - total_weight: 5
name: Charlie 12b - total_weight: 5
name: Charlie 12c - total_weight: 5
name: Alpha 10 - total_weight: 4
name: Delta 2 - total_weight: 3
name: Delta 2b - total_weight: 3
name: Bravo 5 - total_weight: 3

排序之前的数组如下所示:

Array
(
[463] => stdClass Object
(
    [name] => Delta 1b
    [total_weight] => 5
)
[463] => stdClass Object
(
    [name] => Charlie 12
    [total_weight] => 5
)
[340] => stdClass Object
(
    [name] => Charlie 12b
    [total_weight] => 5
)
[340] => stdClass Object
(
    [name] => Charlie 12c
    [total_weight] => 5
)
[342] => stdClass Object
(
    [name] => Delta 1
    [total_weight] => 5
)
[532] => stdClass Object
(
    [name] => Alpha 10
    [total_weight] => 4
)
[203] => stdClass Object
(
    [name] => Bravo 5
    [total_weight] => 3
)
[206] => stdClass Object
(
    [name] => Delta 2
    [total_weight] => 3
)
[208] => stdClass Object
(
    [name] => Delta 2b
    [total_weight] => 3
)

我知道按重量排序,然后按字母顺序可以使用usort:

function _sort_by_total_weight($a, $b)
{
    if ($a->total_weight == $b->total_weight) {
        return strcmp($a->name, $b->name);
    }
    return ($a->total_weight > $b->total_weight) ? -1 : 1;
}

但是,我希望结果不要按字母顺序排列并且感觉随意,而要将一些相关的音轨归为一组。 我意识到我可以将数据库中的行按排序顺序或其他方式进行排序,但是有10,000多个记录,这并不容易实现。 关于如何破解这个螺母有什么想法吗?

编辑 :因此,我在数据库方面(MySQL)对此进行了重新设计,以便在查询到达php之前对其进行加权和排序:

$this->db->select('tracks.id, 
                            tracks.name AS name, 
                            tracks.filename, 
                            tracks.url_name, 
                            tracks.file_path_high, 
                            tracks.filesize, 
                            tracks.categories,
                            tracks.duration, 
                            tracks.folder,
                            links.tag_id,
                            SUM(links.weight) AS total_weight,
                            tag_data.tag_name');

        $this->db->distinct();
        $this->db->from('music AS tracks');
        $this->db->where_in('links.tag_id', array('1', '2');
        $this->db->join('linked_tags AS links', 'links.track_id = tracks.id', 'inner');
        $this->db->join('tags AS tag_data', 'tag_data.id = links.tag_id', 'inner');
        $this->db->group_by("name", "total_weight");
        $this->db->order_by('total_weight DESC, RAND(123)'); 
        $this->db->limit($total, $offset);

但是,现在结果中有一些重复的条目。 对于where_in,是否有一种方法可以声明我只希望具有同时包含1和2的条目的条目,而不返回包含1匹配或2匹配的所有条目?

您可以shuffle()您的数组结果。 来自PHP.net的示例:

<?php
   $numbers = range(1, 20);
   shuffle($numbers);
   foreach ($numbers as $number) {
      echo "$number ";
   }
?>

暂无
暂无

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

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