Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировать многомерный массив 
:(
    Опции темы
SneG0K
Дата 17.1.2010, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 7
Всего: 54



Есть массив.
Код

[{"id":0,"rate":0},{"id":1,"rate":3.5}]

Он правда уже в json'e, но все видно.

То есть массив вложенных двумерных массивов. Нужно отсортировать весь массив, по параметру rate.

Т.е. должно получится

Код

[{"id":1,"rate":3.5}, {"id":0,"rate":0}]

Видел ф-цию array_multisort, но не понял, как с ней обращаться.
PM WWW Skype   Вверх
skyboy
Дата 17.1.2010, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



тебе надо не array_multisort, а usort.
array_multisort надобна в том случае, если бы ты ты хотел переупорядочить не только пары id+rate, но и сами элементы id и rate между собой, что, очевидно, в твоем случае не надо.
и еще уточню: у тебя разве в РНР-части "массив двумерных массивов"? судя по json'y было бы логичнее иметь массив объектов, не?
PM MAIL   Вверх
Simpliest
Дата 18.1.2010, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(skyboy @  17.1.2010,  22:54 Найти цитируемый пост)
array_multisort надобна в том случае, если бы ты ты хотел переупорядочить не только пары id+rate, но и сами элементы id и rate между собой

Не понял мысли.

Что мешает использовать array_multisort?
http://php.net/array_multisort
3й пример.

Добавлено через 4 минуты и 29 секунд
Цитата(skyboy @  17.1.2010,  22:54 Найти цитируемый пост)
у тебя разве в РНР-части "массив двумерных массивов"? судя по json'y было бы логичнее иметь массив объектов, не? 

Ить... А ведь несколько неприятная штука оказалась. Как-то я раньше мимо этого проходил.
Код

$r = array(
array('id' => 0, 'rate' => 0),
array('id' => 1, 'rate' => 3.5)
);
$r = json_encode($r);
var_dump(json_decode($r));
var_dump(json_decode($r, true));



--------------------
user posted image
PM   Вверх
SneG0K
Дата 18.1.2010, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 7
Всего: 54



skyboy, не, массив массивов. Simpliest показал почему так происходит.

skyboy, эээ, я лучше мультисортом)
PM WWW Skype   Вверх
skyboy
Дата 18.1.2010, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(Simpliest @  17.1.2010,  23:10 Найти цитируемый пост)
Что мешает использовать array_multisort?

ничего не мешает, ты прав. просто лично мне кажется немного неожиданным - вычленять "колонки", чтоб сортировать по строкам. и не нравится мне, что логика сравнения, явно отличающаяся от простого "больше-меньше" привязывается к именам полей и их последовательности в порядке аргументов array_multisort. Понадобится добавить ещё поле и учитывать его в сравнении, переименуется поле ассоциативного массива(если имя поля дается на основании выборки из БД) и придется искать все сортировки и корректировать их. 
как по мне - лучше старый-добрый qsort с callback'ом.
впрочем, это мое личное мнение и я согласен, что оно не имеет значения для решения вопроса.

Добавлено @ 09:27
Цитата(Simpliest @  17.1.2010,  23:10 Найти цитируемый пост)
А ведь несколько неприятная штука оказалась. Как-то я раньше мимо этого проходил.

не, ну, я понимаю, что в отличие от РНР, в javascript не сушествует ассоциативных массивов. Я просто предположил насчет объектов. Мало ли.
PM MAIL   Вверх
Simpliest
Дата 18.1.2010, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(skyboy @  18.1.2010,  08:27 Найти цитируемый пост)
вычленять "колонки", 

Согласен. это не слишком удобно.
Но я в таких случаях сразу формирую массив правильной структуры.


Цитата(skyboy @  18.1.2010,  08:27 Найти цитируемый пост)
Я просто предположил насчет объектов. Мало ли. 

Да вот в том-то и дело.... Как-то получилось что я никогда не работал с JSON на получение его в PHP. 
И то, что эта ерунда допускает неоднозначность сериализации!
Это было для меня неприятнейшей новостью.


--------------------
user posted image
PM   Вверх
skyboy
Дата 18.1.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(Simpliest @  18.1.2010,  11:50 Найти цитируемый пост)
И то, что эта ерунда допускает неоднозначность сериализации!

скорее - "десериализации" smile
проверил. у меня код
Код

        $r = array(array('id'=> 0, 'rate'=> 3), array('id'=> 7, 'rate'=> 12));
        $kk = json_decode(json_encode($r));
        var_dump($kk);

выдает
Цитата

array
  0 => 
    object(stdClass)[170]
      public 'id' => int 0
      public 'rate' => int 3
  1 => 
    object(stdClass)[169]
      public 'id' => int 7
      public 'rate' => int 12


Добавлено через 29 секунд
думаю, неоднозначности не будет: всегда объекты будут транслироваться в объекты, а не в ассоциативные массивы
PM MAIL   Вверх
Simpliest
Дата 18.1.2010, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(skyboy @  18.1.2010,  12:14 Найти цитируемый пост)
думаю, неоднозначности не будет: всегда объекты будут транслироваться в объекты, а не в ассоциативные массивы 

Да ну?
Т.е. на вход ты подал объекты?
Цитата(skyboy @  18.1.2010,  12:14 Найти цитируемый пост)
$r = array(array('id'=> 0, 'rate'=> 3), array('id'=> 7, 'rate'=> 12));


В том весь и фокус, что я, например, подам массив из массива и объекта. А вернет оно мне при десериализации массив состоящий или из ДВУХ! массивов или ДВУХ! объектов.
На кой черт такой цирк? smile

Код

<?php
$r = array(
array('id'=> 0, 'rate'=> 3), 
array('id'=> 7, 'rate'=> 12));

$n = new StdClass();
$n->list =  $r;
$n->collection = array(new ArrayObject($r), new ArrayObject($r));

var_dump(json_decode(json_encode($n)));

var_dump(json_decode(json_encode($n), true));

Меня это малость не радует, поскольку я люблю массивы в PHP - очень мощная вещь.
Хотя я уже перехожу на ArrayObject и для обратной совместимости их более чем достаточно... но тем не менее - неприятно.


--------------------
user posted image
PM   Вверх
skyboy
Дата 18.1.2010, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(Simpliest @  18.1.2010,  16:47 Найти цитируемый пост)
Т.е. на вход ты подал объекты?

я не про исходный массив в РНР. на стороне javascript это ж уже объекты были, верно? 
Цитата(Simpliest @  18.1.2010,  16:47 Найти цитируемый пост)
На кой черт такой цирк?

если учесть, что json не предполагает указание метаинформации(класс объекта, тип массива, ссылки) и что ассоциативных массивов в javascript нету, то ничего удивительного нет, верно? и претензий к авторам РНР быть не может. хотя понимаю твое..кхм..возмущение smile
PM MAIL   Вверх
SneG0K
Дата 18.1.2010, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 7
Всего: 54



Так-с, array_multisort выглядит как-то не так для этого. Помогите разобраться с usort'om
Вот на простом примере, вроде моего. Как это работает? Ни как не пойму зачем нужна обратная ф-ция
PM WWW Skype   Вверх
Simpliest
Дата 19.1.2010, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Она как раз и сравнивает. Она получает два элемента.

В ней в твоем случае ты получишь 1й и 2й подмассив

достаточно будет написать 
Код

return $item1['rate'] > $item2['rate'] ? 1 : -1;



--------------------
user posted image
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0528 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.