PHP usort重新排序数组的排序值对所有人来说都是一样的

前端之家收集整理的这篇文章主要介绍了PHP usort重新排序数组的排序值对所有人来说都是一样的前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用usort对每个元素中的关联数组进行排序.

当我在数组中排序的所有值都相同时,它仍然会改变数组中元素的位置,有没有办法防止这种情况?

例如:

array(
    array('name' => 'Ben','authn_weight' => 85.3),array('name' => 'Josh',array('name' => 'Fred','authn_weight' => 85.3)
);

可以改为:

array(
    array('name' => 'Josh',array('name' => 'Ben','authn_weight' => 85.3)
);

这是排序功能

private function weightSortImplementation($a,$b){ 
    $aWeight = $a['autn_weight'];
    $bWeight = $b['autn_weight'];

    if ($aWeight == $bWeight) {
        return 0;
    }
    return ($aWeight < $bWeight) ? 1 : -1;
}

我已经检查过weightSortImplementation函数总是返回0,表明它们是相同的.那为什么这仍然重新排序阵列?

啊哈,一个 Schwartzian Transform的案例.

它基本上包括三个步骤:

>装饰;将每个值转换为数组,其值为第一个元素,键/索引为第二个元素
>排序(按照正常情况)
> undecorate;你逆转了第1步

这是(我已经将它调整到您的特定用例):

function decorate(&$v,$k)
{
    $v['authn_weight'] = array($v['authn_weight'],$k);
}

function undecorate(&$v,$k)
{
    $v['authn_weight'] = $v['authn_weight'][0];
}

array_walk($a,'decorate');
usort($a,'weightSortImplementation');
array_walk($a,'undecorate');

诀窍在于以下断言:

array($x,0) < array($x,1)

这是保持数组正确顺序的原因.并且,不需要递归:)

原文链接:https://www.f2er.com/php/135032.html

猜你在找的PHP相关文章