thinkphp中如何按某个字段的值排序然后按顺序在模板中显示?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thinkphp中如何按某个字段的值排序然后按顺序在模板中显示?相关的知识,希望对你有一定的参考价值。

在模板中我只想显示6条记录,但是显示的6条记录是按照ID(主键)升序排列的。问题就是以后无论我再添加多少新闻,网页显示的6条记录还是不变。所以我想能不能用日期这个字段来进行查询排序,然后输出?但是日期字段又不是主键。求高人指点!

参考技术A $M->where($where)->order("date desc")->select();本回答被提问者采纳

如何在多图中按排序顺序打印键的值

【中文标题】如何在多图中按排序顺序打印键的值【英文标题】:How can I print values of a key in sorted order in a multimap 【发布时间】:2015-06-24 21:16:22 【问题描述】:

我需要设计一个数据结构,它基本上存储键值对,键是整数,值是字符串。

条件1:一个键可能有多个值。

条件2:我需要按降序打印这个map中存储的所有key。

条件3:虽然Keys(整数)以降序打印,但它们对应的值(字符串)必须以字典(升序)顺序打印。

示例输入:

78 Eve                                      
99 Bob                                       
78 Alice                                    

预期输出:

99 Bob
78 Alice
78 Eve

注意键是降序的,而值是升序的。

为此,我用 C++ 编写了以下代码:

#include <iostream>
#include <map>

using namespace std;

int main()

    int N;
    string name;
    int marks;
    multimap<int, string, greater<int>> studMap;
    multimap<int, string, greater<int>>::iterator itBeg, itEnd;
    typedef multimap<int, string, greater<int>>::iterator mapIter;

    cin >> N;   // total no. of key-value pairs input by user

    while (N--)
    
        cin >> name >> marks;  // pairs of value-key input by user - N times
        studMap.insert(pair<int, string>(marks, name));
    

    for (itBeg = studMap.begin(); itBeg != studMap.end(); itBeg = itEnd)
    
        marks = itBeg->first;

        pair<mapIter, mapIter> keyRange = studMap.equal_range(marks);

        for (itEnd = keyRange.first; itEnd != keyRange.second; ++itEnd)
        
            cout << marks << " " << itEnd->second << endl;
        
      
    return 0;

但我得到如下所示的输出:

99 Bob
78 Eve 
78 Alice

而我需要在 (78, Eve) 之前打印 pair(78, Alice)

【问题讨论】:

您需要支持按键查找,还是只支持上述操作?此外,您需要以多高的效率执行此操作是否有任何时间限制? @templatetypedef 我们确实需要按键查找..效率越高越好。 【参考方案1】:

我不会使用多图。我会使用map&lt;int, set&lt;string&gt;&gt;。原因是您需要对键和值进行排序。多图只会对键进行排序。通过使用集合映射,映射将按键排序,集合将按值排序(假设您为其提供了正确的比较器)。

【讨论】:

这可能是最简单的,但是带有自定义比较的多图也可以做到... 不,不会。比较函数只是传递两个键来比较,而不是键和值。如果您建议比较查找值-ewww,那将是可怕的表现。或者取决于实现一个无限递归和堆栈转储。 好吧,我想建议一些更骇人听闻的东西……按照自定义比较的思路,可以访问两个组件的数据本身。我确定超出了学习练习的范围...... @GabeSechan 我修改了我的代码以使用 map> 方法。现在一切似乎都很好。谢谢!【参考方案2】:

如果您想同时按键和值对键值对进行排序,那么您不需要多重映射,它不提供任何方法来对具有相同键的值进行排序。您需要一组配对,并具有自定义比较功能,可按您想要的顺序对它们进行排序。像这样的东西(警告,我脑子里写的代码,未经测试):

using KeyValue = std::pair<int, std::string>;

struct CompareKeyValue 
    bool operator()(const KeyValue& lhs, const KeyValue& rhs) const 
        if (lhs.first != rhs.first)
            return lhs.first > rhs.first; // Reverse order
        else
            return lhs.second < rhs.second;
    
;

std::set<KeyValue, CompareKeyValue> my_data;

【讨论】:

虽然不允许使用非唯一键...等等,为什么 multimap 不能与自定义比较一起使用?比较需要指向包含这两个方面的东西都是...... 它确实允许非唯一键。它不允许使用非唯一的键值对,但如果需要,只需使用多重集而不是集。你不能给多映射一个同时查看键和值的比较,它不会编译。 对我来说更大的问题是,如果您需要检查给定键是否有任何值,则不能。您只能检查给定对是否在数据结构中。

以上是关于thinkphp中如何按某个字段的值排序然后按顺序在模板中显示?的主要内容,如果未能解决你的问题,请参考以下文章

thinkphp如何对查询出来的姓名按字母顺序排序?像手机通讯录那样。我知道用order

mysql 查询时 按照某个字段计算后的值 排序?

thinkPHP二维数组排序

首先按字母顺序对对象数组进行排序,然后按数字排序

SQL如何按两个字段排序,一个按倒序一个按升序?

Java查询出来的数据按照某个字段排序