加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 18:13:43 所属栏目:PHP教程 来源:网络整理
导读:我正在使用usort对每个元素中的关联数组进行排序. 当我在数组中排序的所有值都相同时,它仍然会改变数组中元素的位置,有没有办法防止这种情况? 例如: array( array('name' = 'Ben','authn_weight' = 85.3),array('name' = 'Josh',array('name' = 'Fred','au
我正在使用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)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读