Автор Тема: ORDER BY в PHP без MySQL  (Прочитано 6090 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Foshvad

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 0
    • Просмотр профиля
ORDER BY в PHP без MySQL
« : 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, но, увы. ничего путного не вышло. Если кто знает - подскажите, плз.

Оффлайн ThE0ReTiC

  • Главный по тарелочкам
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 4041
  • +2/-0
  • 2
    • Просмотр профиля
    • http://
ORDER BY в PHP без MySQL
« Ответ #1 : 25 Июля 2002, 01:47:10 »
AS IS...

Оффлайн Foshvad

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 0
    • Просмотр профиля
ORDER BY в PHP без MySQL
« Ответ #2 : 25 Июля 2002, 01:53:47 »
А чуть-чуть подробнее можно?... :)
Не совсем как-то понятно, когда более одного ключа. Я так понимаю алгоритм сортировки надо будет в function cmp() задавать?

Оффлайн ThE0ReTiC

  • Главный по тарелочкам
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 4041
  • +2/-0
  • 2
    • Просмотр профиля
    • http://
ORDER BY в PHP без MySQL
« Ответ #3 : 25 Июля 2002, 02:06:43 »
Foshvad
Именно так.
Пишешь функцию - и в ней все делаешь.
Тебе в общем-то надо, отсортировать массив по первому Value.
Не так сложно.
:)
AS IS...

Оффлайн Tankist

  • Типа на танке
  • Старожил
  • ****
  • Сообщений: 461
  • +0/-0
  • 2
    • Просмотр профиля
ORDER BY в PHP без MySQL
« Ответ #4 : 25 Июля 2002, 02:09:55 »
Ты посмотри там внизу какой-то человек написал как это делать
Удачи

Оффлайн Foshvad

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 0
    • Просмотр профиля
ORDER BY в PHP без MySQL
« Ответ #5 : 25 Июля 2002, 02:47:46 »
М-да... не дурственный примерчик... пойди разберись

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


по первому действительно несложно, но у меня их три....
А может будет бысрее вставить все это в MySQL, и сделать человеческий ORDER BY?.....

Оффлайн Tankist

  • Типа на танке
  • Старожил
  • ****
  • Сообщений: 461
  • +0/-0
  • 2
    • Просмотр профиля
ORDER BY в PHP без MySQL
« Ответ #6 : 25 Июля 2002, 02:54:31 »
Цитировать
М-да... не дурственный примерчик... пойди разберись

в этом согласен...но еслибы мне бы очень было надо я б разобрался думаю..
Удачи

Оффлайн AlieN

  • Абыр!=)
  • Ветеран
  • *****
  • Сообщений: 1315
  • +0/-1
  • 2
    • Просмотр профиля
ORDER BY в PHP без MySQL
« Ответ #7 : 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 "Сортировка по ключу <b>\\"a\\"</b>
<pre>";
$sort_key="a";
usort ($array, "cmp");
print_r($array);
print "</pre>";
#######
print "Сортировка по ключу <b>\\"b\\"</b>
<pre>";
$sort_key="b";
usort ($array, "cmp");
print_r($array);
print "</pre>";
#######
print "Сортировка по ключу <b>\\"c\\"</b>
<pre>";
$sort_key="c";
usort ($array, "cmp");
print_r($array);
print "</pre>";
?> 



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

Сортировка по ключу "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] => Пупкин
        )

)
The Chemical Brothers - Hey Boy Hey Girl (User Friendly Mix)
Peter Presta pres - Set Sail(Peter Presta Apple Jaxx Dub) She S.Sunshine Feat Mila - Bring The Beat Back (Club Mix) Jerry Ropero - Home Alone (Dub Mix)

Оффлайн AlieN

  • Абыр!=)
  • Ветеран
  • *****
  • Сообщений: 1315
  • +0/-1
  • 2
    • Просмотр профиля
ORDER BY в PHP без MySQL
« Ответ #8 : 25 Июля 2002, 10:52:23 »
ЗЫ: можно даже сделать "asc" или "desc"
(умножив результать strcmp($a[$sort_key], $b[$sort_key])
на "-1" - это получится desc)
The Chemical Brothers - Hey Boy Hey Girl (User Friendly Mix)
Peter Presta pres - Set Sail(Peter Presta Apple Jaxx Dub) She S.Sunshine Feat Mila - Bring The Beat Back (Club Mix) Jerry Ropero - Home Alone (Dub Mix)

Оффлайн Foshvad

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 0
    • Просмотр профиля
ORDER BY в PHP без MySQL
« Ответ #9 : 25 Июля 2002, 11:16:27 »
Дык после сортировки по второму ключу "свелись на нет" результаты предыдущей сортировки! :( было по a: 1,2,2 (правильно), а стало 2,2,1 (неправильно)
ну и при сортировки по "с" - по "с" отсортировало прально, но опять таки свелись на нет результаты предыдущей сортировки.

Если я чего-то не допонял - объясни плз.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
ORDER BY в PHP без MySQL
« Ответ #10 : 25 Июля 2002, 15:32:12 »
Он хочет тройной.
О чем и написал в самом первом заявлении.

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

можно просто тупыми ифами сравнивать, если первые кеи не совпадают, то возвращать больший, если нет - то сравнивать вторые, и так далее.
Вообще решений можно массу придумать.
Например, не доводить до такого массива а сортировать заранее, там, откуда они берутнся, например

Оффлайн Foshvad

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 0
    • Просмотр профиля
ORDER BY в PHP без MySQL
« Ответ #11 : 26 Июля 2002, 19:59:08 »
Не доводить "до такого такого массива" не получится - таким массив становится после вычесления релевантности ждя результатов поиска.

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

Получись то, что надо, но как сделать, если бы сохранилась структура массива я так и не придумал.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
ORDER BY в PHP без MySQL
« Ответ #12 : 26 Июля 2002, 23:39:41 »
как это?
усорт должен сохренять!

Оффлайн Foshvad

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 0
    • Просмотр профиля
ORDER BY в PHP без MySQL
« Ответ #13 : 27 Июля 2002, 12:02:01 »
RomikChef Я имел ввиду сортировку usort\'ом по нескольким ключам. Сам по себе он ее ессно сохраняет

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
ORDER BY в PHP без MySQL
« Ответ #14 : 27 Июля 2002, 20:54:11 »
А что значит - "сохранялась структура массива"?

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28