PHP 5.2 GENERIC排序记录集数组所需的函数

时间:2010-05-21 17:48:51

标签: php database sorting arrays

现在有人必须为此提出解决方案。我们使用的是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
        )

)

3 个答案:

答案 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子句。

客户端选项为http://tablesorter.com/docs/