Сортировка многомерного массива

casinolot

Гуру форума
Регистрация
21 Окт 2010
Сообщения
547
Реакции
87
PHP:
$data[0]['id']=1;
$data[1]['id']=4;
$data[2]['id']=7;
$data[0]['r']=10;
$data[1]['r']=40;
$data[2]['r']=20;
$data[0]['status']=4;
$data[1]['status']=3;
$data[2]['status']=0;
$data[0]['name']='Vova1';
$data[1]['name']='Vova2';
$data[2]['name']='Vova3'; 
 
foreach ($data as $key => $row) {
    $volume[$key]  = $row['r'];
    $edition[$key] = $row['status'];
}
 
// Сортируем данные по volume по убыванию и по edition по возрастанию
// Добавляем $data в качестве последнего параметра, для сортировки по общему ключу
array_multisort($volume, SORT_ASC, $edition, SORT_DESC, $data);
echo "<pre>";
var_dump($data);
echo "</pre>";
Вот код, хочется чтобы первыми шли записи с самым больши значением status, и в каждом статусе сортировка по радиусу в пределах своего статуса.
Т.е.должно получаться что-то
status radius
4 110
4 120
3 15
3 16
3 17
1 13
0 10
0 11
 
Может имеет смысл выделить в отдельную таблицу для простоты понимания?
Код:
$status[0]=4;
$status[1]=3;
$status[2]=0;
$status[3]=5;
arsort($status);
var_export(array_keys($status));
/* На выходе имеем
array ( 3, 0, 1, 2, ) - ключи data по убыванию статуса
*/
 
Может я не все пояснения понял, что ты хочешь, но если опираться только на
1. Данные представлены в виде
PHP:
$data[0]['id']=1;
$data[1]['id']=4;
$data[2]['id']=7;
$data[0]['r']=10;
$data[1]['r']=40;
$data[2]['r']=20;
$data[0]['status']=4;
$data[1]['status']=3;
$data[2]['status']=0;
$data[0]['name']='Vova1';
$data[1]['name']='Vova2';
$data[2]['name']='Vova3';
2. Нужно отсортировать данные так, чтобы "первыми шли записи с самым большим значением status, и в каждом статусе сортировка по радиусу в пределах своего статуса."

То это достаточно просто решается пользовательской сортировкой, вот так (я сделал чуть больше данных для наглядности) :
PHP:
    $data[0]['id']=1;
    $data[1]['id']=4;
    $data[2]['id']=7;
    $data[3]['id']=0;
    $data[4]['id']=0;
    $data[5]['id']=0;
    $data[0]['r']=10;
    $data[1]['r']=40;
    $data[2]['r']=10;
    $data[3]['r']=15;
    $data[4]['r']=12;
    $data[5]['r']=33;
    $data[0]['status']=4;
    $data[1]['status']=3;
    $data[2]['status']=0;
    $data[3]['status']=3;
    $data[4]['status']=3;
    $data[5]['status']=5;
    $data[0]['name']='Vova1';
    $data[1]['name']='Vova2';
    $data[2]['name']='Vova3';
    $data[3]['name']='pohh';
    $data[4]['name']='pohh';
    $data[5]['name']='pohh';
 
    function custom_compare($elem1, $elem2) {
        if($elem1['status'] != $elem2['status']) return ($elem1['status'] < $elem2['status']);
        return ($elem1['r'] > $elem2['r']);
    }
    uasort($data, 'custom_compare');
 
    foreach($data as $id => $val) {
        echo "$val[status]\t$val[r]\t$val[name]\t$val[id]<br>";
    }

Выводит соответственно
Код:
5 33 pohh 0
4 10 Vova1 1
3 12 pohh 0
3 15 pohh 0
3 40 Vova2 4
0 10 Vova3 7
 
Рискну предположить что данные вытаскиваются из БД, поему бы вам сразу при селекте не отсортировать как нужно ? и быстрее и аккуратнее
 
Назад
Сверху