【问题标题】:Best practice for sorting arrays, PHP or Javascript?排序数组、PHP 或 Javascript 的最佳实践?
【发布时间】:2014-05-02 23:01:45
【问题描述】:

因此,我对这个特定主题进行了大量研究,但我仍然对最佳方法感到有些困惑。我的问题分为两部分。

1.) 基本上,我的页面正在访问一个 MySQL 音乐数据库,该数据库包含特定艺术家的整个唱片。从字面上看,有1000多种物品。该页面的功能是显示所有项目并按数组中的特定值(用户从预定义列表中选择)对它们进行排序,例如标题、发布日期、目录号、类别等。

据我了解,有两种方法可以实现显示和排序。一旦用户加载页面,PHP 可以立即输出唱片数组,将其回显到 javascript 对象中,然后在用户单击按钮后使用 javascript 进行排序。

用户点击按钮后,我可以使用 AJAX 发送用户希望所有项目排序的值,使用 PHP ** 或数据库服务器排序,如 ORDER BY ** 进行排序并输出数组JSON。例如,按页面名称排序的数组看起来像这样:

var discography = [
    {"id":"1",
     "pagename":"item100001",
     "category":"Albums",
     "Label":"Atlantic",
     "title":"Awesome Album",
     "date":"July 2, 1998",
     "country":"United States",
     "catalog":"666 3333 44444",
     "format":"CD"},
    {"id":"12",
     "pagename":"item100002",
     "category":"Albums",
     "Label":"Epic",
     "title":"Fun Music",
     "date":"January 22, 1992",
     "country":"United Kingdom",
     "catalog":"333 4444 5555",
     "format":"Cassette"},
      {"id":"3",
     "pagename":"item100003",
     "category":"Single",
     "Label":"Atlantic",
     "title":"Cool Single",
     "date":"October 12, 1988",
     "country":"United States",
     "catalog":"444 5555 66666",
     "format":"CD"}
    ];

然后我可以通过 jquery 操作以输出为 html 并在页面上显示项目。

用户应该能够按他们想要的任何值对项目进行排序和重新排序,而不仅仅是一次。

也许这个问题过于简单化了前提,但哪种数组排序方法更智能、更快、更有效?服务器端排序(使用 AJAX 并以 JSON 格式输出)还是 Javascript?如果是服务器端,我相信我知道如何编写函数来正确排序数据。

但如果答案是 Javascript,那就引出我的第二个问题。

2.) 我有found plenty of wonderful javascript sorting functions,但我一直在阅读有关 Javascript 中“稳定”与不稳定排序的问题。这个问题甚至适用吗?我绝对需要在所有浏览器中保持一致。 Merge Sort is apparently a wonderful answer to this quandry,但由于我需要按特定字段(类别、日期等)进行排序,因此我需要一些关于如何使函数适应我的目的的指导。但是,如果我可以在不使用归并排序的情况下进行安全、一致的排序,那么我就这样做了。

如果您读到这里,我将不胜感激。欢迎任何帮助!

【问题讨论】:

  • 为什么不在数据库服务器中对列表进行排序?
  • 您可能需要实际测试一下。在客户端进行排序消除了到服务器的往返行程和数据传输。在服务器上进行排序,特别是在数据库进行排序的情况下,排序可能更快,但需要往返和数据传输。哪个更好取决于要分类和传输的数据量、互联网连接的速度以及您对用户数据上限的关注程度。
  • 排序稳定性问题不是问题。无论如何,您将需要编写自己的比较器,因此只需给它一些逻辑即可知道如何打破平局。如果专辑名称相同,则使用数据库 ID 或日期等。
  • @seaofinformation 视情况而定。如果您在客户端上对查询和视图进行分页,那么您基本上必须在数据库服务器中进行排序,因为它是唯一知道所有行的东西。如果您的列表非常短且始终完整显示,那么您可以在客户端安全地进行排序。
  • 单个页面上的 5000 个项目非常难以管理,您可能希望将其减少到每页最多 50 个,并为用户提供额外的过滤器来缩小范围。

标签: javascript php ajax arrays sorting


【解决方案1】:

很难说正确的方法是什么。 我更喜欢 javascript 解决方案,因为它在服务器上产生的流量更少。

使用array.sort(),您可以通过传递比较函数来获得对对象数组进行排序所需的一切。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

array.sort(function(a,b){return a.id - b.id});

如果函数返回 1,假设 a 大于 b,-1 表示 a 小于 b,0 表示它们相等。

如果有很多项目,Javascript 可能会冻结您的屏幕。在这种情况下,有两个选项。再次处理服务器上的所有内容或使用 WebWorker 进行排序。

【讨论】:

  • because it produces less traffic on the server. - 这取决于数据集的大小。如果你的池子有 1000 个项目,页面大小为 20,那么在服务器端排序 + 分页会导致流量减少,除非有人点击排序/分页链接超过 50 次。
  • 没错。我认为流量不是正确的术语。您更喜欢加载时间还是计算时间?此外,如果我对场景了解不多,也没什么好说的。
  • @Bellian 谢谢,我也担心冻结。如果我使用 Javascript,我会使用一个允许自定义值(排序依据)的函数。
  • @SamDufel,我认为你总结得非常完美。
  • 您可以为每个字段创建一组函数,然后使用switch命令选择正确的switch(sort_by){case 'id': func = function(a,b){...} break; case 'other_field': func = function(a,b){...} break; ....} array.sort(func);
猜你喜欢
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 2012-05-26
相关资源
最近更新 更多