2013-05-30 3 views
0

Мне нужно отсортировать массив в зависимости от того, сколько товара было продано. Затем мне нужно отсортировать его так, чтобы приоритет (что-то выше нуля) был перемещен в начало. Проблема у меня в том, что, когда я второй сорт (шаг 3) Unsort сорта с шага 2.PHP-сортировка по значению массива (приоритет), но сохраняйте исходную сортировку

Шаг 1: У меня есть массив:

array(
    array(
     'title' => 'A', 
     'priority' => 0, 
     'sold_count' => 44 
    ), 
    array(
     'title' => 'B', 
     'priority' => 2, 
     'sold_count' => 0 
    ), 
    array(
     'title' => 'C', 
     'priority' => 1, 
     'sold_count' => 3 
    ), 
    array(
     'title' => 'D', 
     'priority' => 0, 
     'sold_count' => 33 
    ), 
) 

Шаг 2: сортировать его на основе sold_count и получить:

array(
    array(
     'title' => 'A', 
     'priority' => 0, 
     'sold_count' => 44 
    ), 
    array(
     'title' => 'D', 
     'priority' => 0, 
     'sold_count' => 33 
    ), 
    array(
     'title' => 'C', 
     'priority' => 1, 
     'sold_count' => 3 
    ), 
    array(
     'title' => 'B', 
     'priority' => 2, 
     'sold_count' => 0 
    ), 
) 

Шаг 3: сортировка его по приоритету (то, что я должен получить).

array(
    array(
     'title' => 'B', 
     'priority' => 2, 
     'sold_count' => 0 
    ), 
    array(
     'title' => 'C', 
     'priority' => 1, 
     'sold_count' => 3 
    ), 
    array(
     'title' => 'A', 
     'priority' => 0, 
     'sold_count' => 44 
    ), 
    array(
     'title' => 'D', 
     'priority' => 0, 
     'sold_count' => 33 
    ), 
) 

Вместо того, чтобы получить то, что я хочу (шаг 3) Я получаю массив с приоритетом отсортированный прямо однако все другие руководства после того, как у случайном порядке. Все руководства, которые не имеют приоритета (приоритет === 0), не должны использоваться.

Я пробовал кучу методов, используя asort, aasort, custom foreach и установив ключ и этот мультисорт (пример ниже, но взятый из here и here, the example 3).

$sorterA = 
$sorterB = array(); 

foreach($array as $k => $v) { 
    $sorterA[$k] = $k; 
    $sorterB[$k] = $v['priority']; 
} 

array_multisort($sorterA, SORT_NUMERIC, $sorterB, SORT_DESC, SORT_NUMERIC, $array); 

Примечание: Оба сорта должны быть сделаны отдельно (поскольку первый сорт не всегда отсортирован по sold_count, а по дате или других вещей).

+0

Пробовали ли вы [мой ответ] (HTTP://stackoverflow.com/a/16788610/50079) с первого вопроса, с которым вы связались? Сортируйте сначала по приоритету, а затем по 'sold_count' по убыванию. – Jon

+0

Пока нет. Позвольте мне проверить это – iDev247

+0

[Посмотрите] (http://ideone.com/BOLilb). – Jon

ответ

2

Вам просто нужно сортировать по 2 колонки:

usort($arr, function($a, $b) { 
    if ($a['priority'] == $b['priority']) { 
     return $a['sold_count'] < $b['sold_count'] ? 1 : -1; 
    } 

    return $a['priority'] < $b['priority'] ? 1 : -1; 
}); 

поэтому было бы сортировать priority если приоритеты отличаются, в противном случае она сортирует sold_count

+0

Похоже, отличное решение. Мне, однако, нужно сортировать как по отдельности (см. Последнюю заметку моего вопроса). Причина в том, что первая сортировка (sold_count) не всегда сортируется по sold_count. Это было в основном, например. Иногда он сортируется со своим другим слоем сортировки (не беспокойтесь, я все это кешу). – iDev247

+0

«сортировать оба отдельно» - поэтому соответствующим образом измените функцию сравнения. «Раздельный» вид не имеет смысла - он по-прежнему является единственным типом по нескольким критериям. – zerkms

+0

Извините за путаницу. Это связано с тем, что мои данные вытягиваются из своего рода API. API сортирует данные. У меня нет доступа к sold_count, но у меня есть доступ к тому, как он сортируется.Первоначально говорят, что API вернет 'title (priority): A (0), B (0), D (1), C (0), E (0)", после чего я отсортировал его по приоритету, который я получил бы: 'D (1), E (0), B (0), A (0), C (0) '(случайная сортировка после приоритета) вместо' D (1), A (0), B (0), C (0), E (0) '. Взлом из решения, описанного выше, отлично работает. Теперь, когда я думаю об этом, я мог бы также использовать ваше решение, но вместо 'sold_count' заменить' priority'. Я обновлю пару тестов. – iDev247

Смежные вопросы