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

Тема в разделе "Как сделать...", создана пользователем casinolot, 15 ноя 2012.

  1. casinolot

    casinolot

    Регистр.:
    22 окт 2010
    Сообщения:
    548
    Симпатии:
    84
    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($volumeSORT_ASC$editionSORT_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
     
  2. awx

    awx Создатель

    Регистр.:
    7 апр 2009
    Сообщения:
    43
    Симпатии:
    4
    Может имеет смысл выделить в отдельную таблицу для простоты понимания?
    Код:
    $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 по убыванию статуса
    */
     
  3. SolutionFix

    SolutionFix 17 лет програмлю ;)

    Регистр.:
    20 ноя 2006
    Сообщения:
    272
    Симпатии:
    318
    Может я не все пояснения понял, что ты хочешь, но если опираться только на
    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
     
  4. LIAL

    LIAL Создатель

    Регистр.:
    8 июн 2008
    Сообщения:
    111
    Симпатии:
    48
    Рискну предположить что данные вытаскиваются из БД, поему бы вам сразу при селекте не отсортировать как нужно ? и быстрее и аккуратнее