Forum Webscript.Ru

Программирование => PHP => Тема начата: Foshvad от 24 Июля 2002, 23:05:57

Название: ORDER BY в PHP без MySQL
Отправлено: Foshvad от 24 Июля 2002, 23:05:57
Если ли в PHP возможность отсортировать содержимое массива по типу ORDER BY в MySQL?

То есть, если есть массив


$array[key1] = array(\'a\'=>\'2\', \'b\'=>\'Маша\', \'c\' => \'Лялина\');
$array[key2] = array(\'a\'=>\'1\', \'b\'=>\'Петя\', \'c\' => \'Курочкин\');
$array[key3] = array(\'a\'=>\'2\', \'b\'=>\'Вася\', \'c\' => \'Пупкин\');


чтоб в результате полдучилось:


$array[key2] = array(\'a\'=>\'1\', \'b\'=>\'Петя\', \'c\' => \'Курочкин\');
$array[key3] = array(\'a\'=>\'2\', \'b\'=>\'Вася\', \'c\' => \'Пупкин\');
$array[key1] = array(\'a\'=>\'2\', \'b\'=>\'Маша\', \'c\' => \'Лялина\');


Типа ORDER BY a,b,c;
Оч. хотелось бы обойтись без базы и своих алгоритмов сортировки. Игрался с array_multisort, но, увы. ничего путного не вышло. Если кто знает - подскажите, плз.
Название: ORDER BY в PHP без MySQL
Отправлено: ThE0ReTiC от 25 Июля 2002, 01:47:10
http://www.php.net/manual/en/function.usort.php
Название: ORDER BY в PHP без MySQL
Отправлено: Foshvad от 25 Июля 2002, 01:53:47
А чуть-чуть подробнее можно?... :)
Не совсем как-то понятно, когда более одного ключа. Я так понимаю алгоритм сортировки надо будет в function cmp() задавать?
Название: ORDER BY в PHP без MySQL
Отправлено: ThE0ReTiC от 25 Июля 2002, 02:06:43
Foshvad
Именно так.
Пишешь функцию - и в ней все делаешь.
Тебе в общем-то надо, отсортировать массив по первому Value.
Не так сложно.
:)
Название: ORDER BY в PHP без MySQL
Отправлено: Tankist от 25 Июля 2002, 02:09:55
Ты посмотри там внизу какой-то человек написал как это делать
Название: ORDER BY в PHP без MySQL
Отправлено: Foshvad от 25 Июля 2002, 02:47:46
М-да... не дурственный примерчик... пойди разберись

Цитировать
Тебе в общем-то надо, отсортировать массив по первому Value.
Не так сложно.


по первому действительно несложно, но у меня их три....
А может будет бысрее вставить все это в MySQL, и сделать человеческий ORDER BY?.....
Название: ORDER BY в PHP без MySQL
Отправлено: Tankist от 25 Июля 2002, 02:54:31
Цитировать
М-да... не дурственный примерчик... пойди разберись

в этом согласен...но еслибы мне бы очень было надо я б разобрался думаю..
Название: ORDER BY в PHP без MySQL
Отправлено: AlieN от 25 Июля 2002, 10:20:19
Цитировать
может будет бысрее вставить все это в MySQL,

ну блин усё просто:

function cmp ($a, $b) {
  global $sort_key;
    return strcmp($a[$sort_key], $b[$sort_key]);
}
$array[] = array(\'a\'=>\'2\', \'b\'=>\'Маша\', \'c\' => \'Лялина\');
$array[] = array(\'a\'=>\'1\', \'b\'=>\'Петя\', \'c\' => \'Курочкин\');
$array[] = array(\'a\'=>\'2\', \'b\'=>\'Вася\', \'c\' => \'Пупкин\');
print "Сортировка по ключу \\"a\\"
";
$sort_key="a";
usort ($array, "cmp");
print_r($array);
print "
";
#######
print "Сортировка по ключу \\"b\\"
";
$sort_key="b";
usort ($array, "cmp");
print_r($array);
print "
";
#######
print "Сортировка по ключу \\"c\\"
";
$sort_key="c";
usort ($array, "cmp");
print_r($array);
print "
";
?>



Результат исполнения:
Цитировать

Сортировка по ключу "a"

Array
(
   
  • => Array

        (
            [a] => 1
            => Петя
            [c] => Курочкин
        )

    [1] => Array
        (
            [a] => 2
            => Вася
            [c] => Пупкин
        )

    [2] => Array
        (
            [a] => 2
            => Маша
            [c] => Лялина
        )

)

Сортировка по ключу "b"

Array
(
   
  • => Array

        (
            [a] => 2
            => Вася
            [c] => Пупкин
        )

    [1] => Array
        (
            [a] => 2
            => Маша
            [c] => Лялина
        )

    [2] => Array
        (
            [a] => 1
            => Петя
            [c] => Курочкин
        )

)

Сортировка по ключу "c"

Array
(
   
  • => Array

        (
            [a] => 1
            => Петя
            [c] => Курочкин
        )

    [1] => Array
        (
            [a] => 2
            => Маша
            [c] => Лялина
        )

    [2] => Array
        (
            [a] => 2
            => Вася
            [c] => Пупкин
        )

)
Название: ORDER BY в PHP без MySQL
Отправлено: AlieN от 25 Июля 2002, 10:52:23
ЗЫ: можно даже сделать "asc" или "desc"
(умножив результать strcmp($a[$sort_key], $b[$sort_key])
на "-1" - это получится desc)
Название: ORDER BY в PHP без MySQL
Отправлено: Foshvad от 25 Июля 2002, 11:16:27
Дык после сортировки по второму ключу "свелись на нет" результаты предыдущей сортировки! :( было по a: 1,2,2 (правильно), а стало 2,2,1 (неправильно)
ну и при сортировки по "с" - по "с" отсортировало прально, но опять таки свелись на нет результаты предыдущей сортировки.

Если я чего-то не допонял - объясни плз.
Название: ORDER BY в PHP без MySQL
Отправлено: Меняздесьдавнонет от 25 Июля 2002, 15:32:12
Он хочет тройной.
О чем и написал в самом первом заявлении.

Самое простое было бы, если бы первым значением была бы не цифра, сравнивать строку, полученную сложением всех значений массива.
то есть,
2МашаЛялина
1ПетяКурочкин
2ВасяПупкин
т.е. сравнивать implode(\'\',$array[key])
но тут встает та же проблема с сортировкой чисел отличающихся на порядок, как в файловых менеджерах. Можно добивать str_pad или number_format ом.

можно просто тупыми ифами сравнивать, если первые кеи не совпадают, то возвращать больший, если нет - то сравнивать вторые, и так далее.
Вообще решений можно массу придумать.
Например, не доводить до такого массива а сортировать заранее, там, откуда они берутнся, например
Название: ORDER BY в PHP без MySQL
Отправлено: Foshvad от 26 Июля 2002, 19:59:08
Не доводить "до такого такого массива" не получится - таким массив становится после вычесления релевантности ждя результатов поиска.

Но вообще-то выкрутиться удалось сведя значения массива к int\'а, сделав str_pad(), склеив в одну строку и воспользовавшись asort\'м

Получись то, что надо, но как сделать, если бы сохранилась структура массива я так и не придумал.
Название: ORDER BY в PHP без MySQL
Отправлено: Меняздесьдавнонет от 26 Июля 2002, 23:39:41
как это?
усорт должен сохренять!
Название: ORDER BY в PHP без MySQL
Отправлено: Foshvad от 27 Июля 2002, 12:02:01
RomikChef Я имел ввиду сортировку usort\'ом по нескольким ключам. Сам по себе он ее ессно сохраняет
Название: ORDER BY в PHP без MySQL
Отправлено: Меняздесьдавнонет от 27 Июля 2002, 20:54:11
А что значит - "сохранялась структура массива"?
Название: ORDER BY в PHP без MySQL
Отправлено: Foshvad от 27 Июля 2002, 21:15:07
Чтобы не надо было создавать вспомогательный массив с объединенными в одну строку значениями. Результат был в в таком виде, как у AlieN, только отсортированный правильно
Название: ORDER BY в PHP без MySQL
Отправлено: Меняздесьдавнонет от 27 Июля 2002, 21:22:55
А зачем его создавать?
разве нельзя создавать эти строки внутри функции усорт?
Название: ORDER BY в PHP без MySQL
Отправлено: Foshvad от 27 Июля 2002, 21:35:53
Хм... действитеьлно можно. Не подумал :)