PHP根据modx中用空格分隔的姓氏对数组进行排序


PHP sort an array by lastname separated by whitespace in modx

我有一个mysql表,如下所示:

id author public image1 image2 image3 bio media1 media2 media3 media4 media5 media6

字段"author"normaly的名字(Secondname)用空格分隔。如何在Lastname之后对数组进行排序?如果在这个名称之后只有一个名称。

这是我用来按作者排序的modx查询,但显然它没有使用姓氏。

  $c = $modx->newQuery('AuthorDe');
  $c->sortby('author','ASC');
  $authors = $modx->getCollection('AuthorDe',$c);

你现在正朝自己的脚开枪,原因有几个:

  • 当字符串中只有一个单词时,排序很难预测
  • 您为数据建立索引是有原因的。它们使它更快。使用字符串函数强制执行表扫描。对于100个数据单元来说足够好,对于10000行来说足够慢,并且"数据库休假"为1000000
  • 下次您必须使用author字段,并且您意识到必须将其拆分为多个单词时,您还必须理解并在旧代码段的基础上修复此代码段

也就是说-我还没有测试过-但试试这个:

$c->sortby('substring_index(author," ",-1)','ASC');

因此,要详细说明所做的非常有价值的点日志,将多个数据点放在一个数据库列中会适得其反。你想做的排序将是简单,快速,&高效,在sql查询中(使用jous显示的相同构造,但没有字符串操作)。
要修改此表,只需在表中添加以下列来代替作者:
名字
姓氏
中间名

为了向您展示这是多么简单(并使其更加容易),以下是实现这一点的代码:

ALTER TABLE [tablename] 
ADD COLUMN firstname varchar(32) 
ADD COLUMN lastname varchar(32) 
ADD COLUMN middlename varchar(32)
DROP COLUMN author;

然后modx PHP代码将是:

$c->sortby('lastname','ASC');

所以这很容易做到。。。如果你仍然需要支持对author的其他引用,那么创建一个视图,以未更改的表的方式返回author,如下所示(注意:你仍然需要更改表名引用,使其指向视图而不是表…如果这将是一个大问题,那么重命名表并将视图命名为与旧表相同的名称…):

CREATE VIEW oldtablename AS 
SELECT firstname+' '+middlename+' '+lastname' ' AS author
FROM newtablename;

注意:如果你确实创建了一个如上所述的视图,那么从新表中添加所有其他列(多个图像和媒体列)可能是值得的。注2:然而,我要补充的是,理想情况下,这些表将位于单独的表中,并带有与此表的联接表。。。但如果我在你的位置上,我可能会同意权宜之计可能会战胜效用;未来可用性。。。。然而,如果你确实把它们放在不同的表中,你可以把这些表添加到这个视图中(作为新表的联接),并且仍然能够支持依赖于旧表的现有代码&它的结构。

虽然以上内容都很容易完成,并且只需您进行一些小的调整即可完成,但最后一部分是让您的自定义表更改由xPDO反映出来。如果你已经对此感到舒服,并且知道该做什么,那就太好了。如果你不是,这是迄今为止关于这个主题的最好的文章:http://bobsguides.com/custom-db-tables.html

(是的,将Bob的代码作为一个片段是值得的,这样一旦数据库更改完成,所有这些都可以简单地为您生成…(请记住,在运行Bob的生成代码之前,您可能需要删除现有的架构文件和xpdo相关的类文件和映射文件,否则具有相同表名的更改(如视图)将不会生效)。

希望这能帮助你(或下一个问类似问题的人)。