PHP 5.2 Функция, необходимая для общей сортировки массива наборов записей - PullRequest
0 голосов
/ 21 мая 2010

Кто-то, должно быть, уже нашел решение для этого. Мы используем PHP 5.2. (Не спрашивайте меня, почему.) Я написал класс PHP для отображения набора записей в виде таблицы / таблицы данных HTML, и я хочу расширить его, чтобы мы могли отсортировать таблицу данных по любому столбцу, выбранному пользователем. В приведенных ниже примерах данных нам может понадобиться отсортировать массив наборов записей по полям Name, Shirt, Assign или Age. Я позабочусь о части отображения, мне просто нужна помощь с сортировкой массива данных.

Как обычно, я запрашиваю базу данных, чтобы получить результат, перебираю результаты и помещаю записи в массив assciateiave. Таким образом, мы получаем массив массивов. (См. Ниже.) Мне нужно иметь возможность сортировать по любому столбцу в наборе данных. Однако я не буду знать имена столбцов во время разработки и не буду знать, будут ли столбцы строковыми или числовыми значениями.

Я видел множество решений для этого, но я не видел ХОРОШЕГО и ОБЩЕГО решения. Может кто-нибудь предложить способ сортировки массива наборов записей, который является ОБЩИМ и будет работать на любом наборе записей? Опять же, я не буду знать имена полей или типы данных во время разработки. Массив, представленный ниже, является ТОЛЬКО примером.

ОБНОВЛЕНИЕ: Да, я бы хотел, чтобы база данных выполняла сортировку, но этого просто не произойдет. Запросы, которые мы выполняем, очень сложны. (На самом деле я не запрашиваю таблицу символов Star Trek.) Они включают в себя объединения, ограничения и сложные предложения 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 ]

3 голосов
/ 21 мая 2010

Ну, во-первых, вы должны сортировать в базе данных (это более эффективно).Если нет

в php 5.3 +:

function getSortCommand($field, $sortfunc) {
    return function($var1, $var2) use ($field, $sortfunc) {
        return $sortfunc($var1[$field], $var2[$field]);
    }
}

в php <= 5.2, вам нужно создать чистую функцию: </p>

function getSortCommand($field, $sortfunc) {
    return create_function('$var1, $var2', 'return '.$sortfunc.'($var1["'.$field.'"], $var2["'.$field.'"]);');
}

Использование для обоих:

$array = usort($array, getSortCommand('name', 'strnatcasecmp'));

Чтобы настроить поле, просто измените параметр $ field.Чтобы изменить функцию сортировки, просто измените параметр $ sortfunc ...

1 голос
/ 21 мая 2010

Я предлагаю вам сделать это в базе данных.В противном случае вы можете использовать это:

function sortby(&$arr, $column) {
    usort($arr,
        function ($a, $b) use ($column) {
            return strcmp($a[$column], $b[$column]);
        }
    );
}
0 голосов
/ 21 мая 2010

Вы должны обязательно выполнить сортировку при запросе базы данных.

Вы делаете это, добавляя ссылку типа ?orderby=name&dir=asc в <TH> s

Затем, когда вы запрашиваете базу данных, вы проверяете наличие $_GET['orderby']. Если он существует, вы добавляете заказ по предложению.

Клиентская опция http://tablesorter.com/docs/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...