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.
我想通过 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.