现在有人必须为此提出解决方案。我们使用的是PHP 5.2。 (不要问我为什么。)我写了一个PHP类来将记录集显示为HTML表/ datagrid,我希望扩展它,以便我们可以按用户选择的任何一列对数据网格进行排序。在下面的示例数据中,我们可能需要按Name,Shirt,Assign或Age字段对记录集数组进行排序。我会处理显示部分,我只需要帮助整理数据数组。
像往常一样,我查询数据库以获得结果,迭代结果,并将记录放入assciateiave数组中。所以,我们最终得到了一个数组数组。 (见下文。)我需要能够按数据集中的任何列进行排序。但是,我不会在设计时知道列名,也不会知道列是否为字符串或数值。
我已经看到了大量的解决方案,但是我还没有看到GOOD和GENERIC解决方案有人可以建议一种方法,我可以对GENERIC的记录集数组进行排序,并且可以在任何记录集上工作吗?同样,我不会在设计时知道字段名称或数据类型。下面列出的数组只是一个例子。
更新:是的,我很乐意让数据库进行排序,但这不会发生。我们正在运行的查询非常复杂。 (我并不是在查询星际迷航角色的表格。)它们包括连接,限制和复杂的WHERE子句。编写一个函数来分离SQL语句以添加ORDER BY实际上不是一个选项。此外,有时我们已经拥有了查询结果的数组,而不是运行新查询的能力。
Array
(
[0] => Array
(
[name] => Kirk
[shrit] => Gold
[assign] => Bridge
)
[1] => Array
(
[name] => Spock
[shrit] => Blue
[assign] => Bridge
)
[2] => Array
(
[name] => Uhura
[shrit] => Red
[assign] => Bridge
)
[3] => Array
(
[name] => Scotty
[shrit] => Red
[assign] => Engineering
)
[4] => Array
(
[name] => McCoy
[shrit] => Blue
[assign] => Sick Bay
)
)
答案 0 :(得分:3)
嗯,首先,您应该在数据库中进行排序(它更有效)。如果不是
在php 5.3 +中:
function getSortCommand($field, $sortfunc) {
return function($var1, $var2) use ($field, $sortfunc) {
return $sortfunc($var1[$field], $var2[$field]);
}
}
在php< = 5.2中,你需要创建一个纯函数:
function getSortCommand($field, $sortfunc) {
return create_function('$var1, $var2', 'return '.$sortfunc.'($var1["'.$field.'"], $var2["'.$field.'"]);');
}
两者的用法:
$array = usort($array, getSortCommand('name', 'strnatcasecmp'));
要调整字段,只需更改$ field参数即可。要更改排序功能,只需更改$ sortfunc参数...
答案 1 :(得分:1)
我建议你在数据库中这样做。否则,你可以使用:
function sortby(&$arr, $column) {
usort($arr,
function ($a, $b) use ($column) {
return strcmp($a[$column], $b[$column]);
}
);
}
答案 2 :(得分:0)
查询数据库时一定要进行排序。
您可以通过向?orderby=name&dir=asc
<TH>
之类的链接来实现此目的
然后,当您查询数据库时,检查是否存在$_GET['orderby']
。如果存在,则添加order by子句。