Нужна помощь по сортировке многомерного массива на PHP

S
На сайте с 21.05.2006
Offline
209
875

Мучаюсь такой задачкой:

Получаем данные и помещаем их в массив.

foreach ($data as $item) {
$array[] = array ('value' => $item->value, '$name' => $item->name, 'city' => $item->city);
}

Далее нужно выводить записи отсортированные по полю value (т.е. как ORDER BY в MySQL).

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

foreach ($array as $key => $row) {
$value[$key] = $row['value'];
$name[$key] = $row['name];
$city[$key] = $row['city'];
}
array_multisort($value, SORT_ASC, $name, SORT_ASC, $array);

Может кто-то знающий подскажет решение сего вопроса?

Как все же вывести отсортированный массив?

IL
На сайте с 20.04.2007
Offline
435
#1

Вроде правильно всё.. а что в массивах лежит?

shav:
Как все же вывести отсортированный массив?

print_r ($array); // что выведет после сортировки?

shav:
Получаем данные и помещаем их в массив.

А чего сразу не в массив?

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
RiDDi
На сайте с 06.06.2010
Offline
256
#2

array_multisort не отсортирует Вам массив снаружи. Она сортирует каждый массив отдельно внутри многомерного.

Возможны варианты:

1. Если $item->value уникально - поместите его в ключ:

$array[$item->value] = array ('value' => $item->value, '$name' => $item->name, 'city' => $item->city);

2. Откуда берется $data? Может легче там отсортировать где берется? В идеале сортировать на уровне получения из базы данных. Сортировка - прерогатива БД.

3. Перебирать всё это дело и сортировать. Типа:



$by = 'value';
usort($array, function($first, $second) use( $by ) {
if ($first[$by]>$second[$by]) return 1;
elseif ($first[$by]<$second[$by]) return -1;
return 0;
});
print_r($array);
Вебмастер отдыхает на бережках морей. Заработок в интернете - дело техники.
S
На сайте с 21.05.2006
Offline
209
#3
ivan-lev:
Вроде правильно всё.. а что в массивах лежит?

Да я все с тем же мучаюсь:

<rates>
<rate>
<currency>RUB</currency>
<value>6.2</value>
<base-coefficient>REFINANCING_RATE_CB_RF</base-coefficient>
<min-period interval="DAY">730</min-period>
<max-period interval="DAY">730</max-period>
<min-sum currency="RUB">5000000</min-sum>
<max-sum currency="RUB">19999999</max-sum>
</rate>
</rates>

Вот в массив и парсятся: $xml->rate->value и т.д.

ivan-lev:

print_r ($array); // что выведет после сортировки?

В том порядке что и на входе.

ivan-lev:

А чего сразу не в массив?

Как умею, а умею плохо. :)

---------- Добавлено 26.10.2012 в 22:16 ----------

RiDDi:

1. Если $item->value уникально - поместите его в ключ:
$array[$item->value] = array ('value' => $item->value, '$name' => $item->name, 'city' => $item->city);

Не факт, что уникально. Скорее не уникально.

RiDDi:

3. Перебирать всё это дело и сортировать. Типа

// Отсортировать по стобцу score

$rating = array(
array('name'=>'Vasya', 'score'=>152),
array('name'=>'Igor', 'score'=>73),
array('name'=>'Kolya', 'score'=>312),
array('name'=>'Pavel', 'score'=>100),
array('name'=>'Roman', 'score'=>429),
array('name'=>'Alex', 'score'=>56)
);

$by = 'score';
usort($rating, function($first, $second) use( $by ) {
if ($first[$by]>$second[$by]) { return 1; }
elseif ($first[$by]<$second[$by]) { return -1; }
return 0;
});
print_r($rating);

Спасибо. Попробую не досуге.

siv1987
На сайте с 02.04.2009
Offline
427
#4

php < 5.3

uasort( $array, create_function('$a, $b', 'return $a["value"] > $b["value"] ? 1 : -1;') );

php >= 5.3

uasort( $array, function( $a, $b ){return $a["value"] > $b["value"] ? 1 : -1;});

bay_ebook
На сайте с 28.05.2010
Offline
111
#5


foreach ($data as $item) {
$array[] = array ('value' => $item->value, '$name' => $item->name, 'city' => $item->city);
}

если данные не уникальны, делаем так:


foreach ($data as $item) {
$array[$item->value][] = array ('value' => $item->value, '$name' => $item->name, 'city' => $item->city);
}

а дальше просто учитывать при выводе, что у нас массив, и обрабатывать его в foreach

Нужен прогер на php+mysql+понимание чужего кода? (/ru/forum/540660) Вам сюда PHP-шаман (http://php-shaman.pw/)
Z1
На сайте с 09.12.2005
Offline
164
#6

array_multisort всё чётко мультисортирует, только надо правильно его использовать.

Если у Вас такой массив:


$array['value'][] = $item->value;
$array['name'][] = $item->name;
$array['city'][] = $item->city;

то сортировать надо примерно так:


array_multisort(
$array['value'], SORT_NUMERIC, SORT_DESC,
$array['name'], SORT_NUMERIC, SORT_DESC,
$array['city'], SORT_NUMERIC, SORT_DESC
);

Естественно, порядок столбцов и константы сортировки выбирайте сами.

P.S. bb-код php как-то криво на этом форуме работает, у bay_ebook вон покорябал скриптик, у меня тоже хотел.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий