PHP - Как сортировать и массивировать соответствующие позиции в «вспомогательном массиве», когда отсутствуют числовые «ключи foreach» - PullRequest
0 голосов
/ 17 мая 2019

У меня array1 вот так:

[user2] => 27
[user3] => 30
[user4] => 33
[user5] => 36
[user6] => 39
[user10] => 39
[user12] => 42

Использование второго массива (helper, authority):

[user2] => 6
[user3] => 7
[user4] => 1
[user5] => 4
[user6] => 3
[user10] => 2
[user12] => 5

И я хочу отсортировать array1 вот так

[user2] => 27
[user3] => 30
[user4] => 33
[user5] => 36
[user10] => 39 // user10 goes before user6
[user6] => 39
[user12] => 42

Алгоритмы: Когда строки в array1 имеют одинаковое значение, отметьте authority array и измените порядок строк одинакового значения в соответствии с ним.Чем ниже значение, тем выше (раньше) оно идет в отсортированном array1 (user10 имеет значение 2 в authority array и, следовательно, оно идет до user6, которое имеет значение 3 в authority array).

array1 - это порядок пользователей, основанный на голосовании различных сенаторов.Есть также «президент сената».Если у вас есть пользователи с одинаковыми результатами (user6 и user10), измените их порядок в соответствии с предпочтением «президент».

Другой возможный ввод:

$arr = [
    "user7" => 15,
    "user11" => 15,
    "user4" => 30,
    "user19" => 36,
    "user10" => 39,
];

$helper = [
    "user4" => 3,
    "user7" => 2,
    "user10" => 4,
    "user11" => 1,
    "user19" => 5,
];

, пока это необходимовывод

Array
(
    [user11] => 15
    [user7] => 15
    [user4] => 30
    [user19] => 36
    [user10] => 39
)

1 Ответ

2 голосов
/ 17 мая 2019

Один из вариантов - использовать array_keys и array_flip, чтобы получить массив заказов.Используйте uksort для сортировки массива на основе order

$arr = ....
$helper = ...
$order = array_flip(array_keys( $helper ));
uksort ( $arr , function( $a , $b ) use ( $order, $arr, $helper ) {
    if ( $arr[$a] != $arr[$b] ) return $order[$a] - $order[$b];
    return $helper[$a] - $helper[$b];
});

ОБНОВЛЕНИЕ:

$arr = [
    "user7" => 15,
    "user11" => 15,
    "user4" => 30,
    "user19" => 36,
    "user10" => 39,
];

$helper = [
    "user4" => 3,
    "user7" => 2,
    "user10" => 4,
    "user11" => 1,
    "user19" => 5,
];

uksort ( $arr , function( $a , $b ) use ( $arr, $helper ) {
    if ( $arr[$a] != $arr[$b] ) return $arr[$a] - $arr[$b];
    return $helper[$a] - $helper[$b];
});

Это приведет к:

Array
(
    [user11] => 15
    [user7] => 15
    [user4] => 30
    [user19] => 36
    [user10] => 39
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...