PHP - usort 按具有复杂功能的提供程序对数组列表进行排序

PHP - usort to order array list by provider with complex function

我想通过 itemOrderList(在示例代码 中的变量中可用)来订购 MyObject 列表 ($myObjectList),因为 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']);

在这种情况下,我建议为每个提供者使用某种权重,您的排序函数可以如下所示:

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;
}

示例 fiddle here.