Каков наилучший способ сортировки этого массива в php? - PullRequest
3 голосов
/ 11 февраля 2010

Я не могу придумать ни одного вменяемого решения этой проблемы, не прибегая к смешным комбинациям пользовательских функций. Может быть, вы можете дать некоторые свежие мысли по этому поводу.

У меня есть следующий (упрощенный) массив

Array
(
    [0] => Array
        (
            [vid_id] => 420037
            [vid_rating] => 2.93827
            [vid_quality] => 2
            [vid_special] => 1
            [vid_weight] => 0
            [vid_position] => 0
            [vid_position_end] => 0
        )

    [1] => Array
        (
            [vid_id] => 420040
            [vid_rating] => 3
            [vid_quality] => 1
            [vid_special] => 1
            [vid_weight] => 0
            [vid_position] => 0
            [vid_position_end] => 0
        )

    [2] => Array
        (
            [vid_id] => 426455
            [vid_rating] => 3.25581
            [vid_quality] => 2
            [vid_special] => 0
            [vid_weight] => 5
            [vid_position] => 1
            [vid_position_end] => 2
        )

    [3] => Array
        (
            [vid_id] => 429804
            [vid_rating] => 3
            [vid_quality] => 2
            [vid_special] => 0
            [vid_weight] => 0
            [vid_position] => 0
            [vid_position_end] => 0
        )

    [4] => Array
        (
            [vid_id] => 420848
            [vid_rating] => 2.94444
            [vid_quality] => 2
            [vid_special] => 0
            [vid_weight] => 3
            [vid_position] => 1
            [vid_position_end] => 2
        )

    [5] => Array
        (
            [vid_id] => 420859
            [vid_rating] => 2.73077
            [vid_quality] => 2
            [vid_special] => 0
            [vid_weight] => 4
            [vid_position] => 1
            [vid_position_end] => 2
        )

    [6] => Array
        (
            [vid_id] => 420524
            [vid_rating] => 2.41379
            [vid_quality] => 2
            [vid_special] => 0
            [vid_weight] => 5
            [vid_position] => 2
            [vid_position_end] => 2
        )

    [7] => Array
        (
            [vid_id] => 419810
            [vid_rating] => 3.13393
            [vid_quality] => 1
            [vid_special] => 0
            [vid_weight] => 0
            [vid_position] => 0
            [vid_position_end] => 0
        )

    [8] => Array
        (
            [vid_id] => 419851
            [vid_rating] => 2.97802
            [vid_quality] => 1
            [vid_special] => 0
            [vid_weight] => 5
            [vid_position] => 1
            [vid_position_end] => 2
        )

    [9] => Array
        (
            [vid_id] => 419843
            [vid_rating] => 2.95349
            [vid_quality] => 1
            [vid_special] => 0
            [vid_weight] => 3
            [vid_position] => 1
            [vid_position_end] => 2
        )

    [10] => Array
        (
            [vid_id] => 419838
            [vid_rating] => 2.73529
            [vid_quality] => 1
            [vid_special] => 0
            [vid_weight] => 4
            [vid_position] => 1
            [vid_position_end] => 2
        )

)

Этот массив является результатом этого запроса MySQL

    SELECT 
    vid_id,
    vid_rating,
    vid_quality,
    vid_special,
    vid_weight,
    vid_position,
    vid_position_end
FROM versions
WHERE vid_movid = 'xxxxx' AND vid_status = 1 
ORDER BY vid_special DESC, vid_quality DESC, vid_rating DESC

В результате выводится список ссылок на веб-сайты (для простоты фактически удален столбец ссылок), которые необходимо разместить в очень конкретном порядке. Делать то, что мне нужно, можно с несколькими запросами UNIONed ... но я действительно не хочу прибегать к этому, поскольку стоимость будет очень высокой, поэтому я решил, что манипулировать массивами будет проще.

Мне нужно выборочно извлечь несколько ссылок из этого массива и поместить их поверх массива в определенном порядке.

  • Ссылки, отмеченные vid_position, и vid_position_end обозначает диапазон, который эта группа будет занимать. Означающий, что если помечено несколько ссылок с этими позициями только 2 будут толкнул к вершине, если диапазон 1-2. если его 1-3, то топ 3 должности будут заняты.

  • Вес обозначает ЗАКАЗ, в котором ссылки должны быть отсортированы. Так что если есть 5 разных ссылок, с 5 разными гири в диапазоне позиций 1-2, толкаются только 2 верхних веса наверх Остальные 3 будут оставайся там, где они есть.

  • Существуют разные группы ссылок. В этом случае есть группа 1-2, и 3-3. Первая группа занимает первые 2 позиции, и в моем примере имеет 3 весовых категории. другая группа занимает 3-е место, и только имеет 1 весовую категорию.

  • Заказ должен быть независимым. Если в 1-2 нет ссылок группа, но есть ссылки в 3-3, это означает, что 3-3 сгруппированные ссылки будут появляются в первой позиции.

Ответы [ 2 ]

1 голос
/ 11 февраля 2010

Для каждого элемента в массиве создайте запись в массиве 'sort_by', где для записи задано значение "оценка" сортировки, которое вы создаете.

Счет генерируется вашим алгоритмом заказа ваших записей. Помните, что вы можете создать счет с большими числами. Например, самый младший порядок сортировки умножается на 10, следующий самый младший порядок сортировки умножается на 100, затем на 1000, затем складывается число, чтобы получить оценку для записи.

Затем используйте Сортировать массив по ключам на основе другого массива? отсортировать основной массив по массиву sort_by

Добавлено: Этот метод хорош, если он медленный или дорогой, чтобы выяснить порядок между двумя исходными элементами массива, поскольку оценка выполняется только один раз для исходного элемента массива. Если упорядочить легко, то использование uasort, вероятно, будет более понятным кодом.

0 голосов
/ 11 февраля 2010

Для ручной сортировки массивов я бы использовал uasort или одну из его относительных функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...