PHP - usort для упорядочения списка массивов провайдером со сложной функцией - PullRequest
0 голосов
/ 04 ноября 2019

Я бы хотел заказать список MyObject ($myObjectList) по itemOrderList (, доступный в переменной в примере кода ), как MyObject без поставщика, MyObject с поставщиком Gmail, MyObject с поставщиком Hotmail,и другие в конце.

private function reOrderByProvider(
    MyObject $actualObject,
    MyObject $nextObject
): int {
    $actual = array_search($actualObject->getProvider(), $this->itemOrderList);
    $next   = array_search($nextObject->getProvider(), $this->itemOrderList);

    if ($actual === $next) {
        return 0;
    }

    return (($next === false) || ($actual < $next)) ? -1 : +1;
}

Список заказов, которые я должен соблюдать:

$this->itemOrderList = [null, 'gmail', 'hotmail'];

У меня есть несколько объектов с поставщиком Gmail, поставщиком Hotmail, а некоторые объекты не являютсяперечисленные в списке, эти незарегистрированные поставщики должны быть в конце сортировки.

Для этого я использую эту функцию PHP usort($myObjectList, [$this, 'reOrderByProvider']);

1 Ответ

1 голос
/ 04 ноября 2019

В этом случае я рекомендую использовать некоторые веса для каждого поставщика, ваша функция сортировки может выглядеть следующим образом:

function reOrderByProvider(
    MyObject $actualObject,
    MyObject $nextObject
) {
    $weights = [
        null => 100, 
        'gmail' => 50, 
        'hotmail' => 25,
    ];
    $provider = $actualObject->getProvider();
    $actualObjectWeight = array_key_exists($provider, $weights) ? $weights[$provider] : 0;
    $provider = $nextObject->getProvider();
    $nextObjectWeight = array_key_exists($provider, $weights) ? $weights[$provider] : 0;

    return $nextObjectWeight - $actualObjectWeight;
}

Образец скрипта здесь .

...