gpt4 book ai didi

PHP usort 重新排序数组,排序值对所有数组都相同

转载 作者:可可西里 更新时间:2023-11-01 12:43:14 27 4
gpt4 key购买 nike

我正在使用 usort 对每个元素内具有关联数组的数组进行排序。

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

例如这个:

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

可以改成这样:

array(
array('name' => 'Josh', 'authn_weight' => 85.3),
array('name' => 'Ben', 'authn_weight' => 85.3),
array('name' => 'Fred', '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 的案例.

它主要由三个步骤组成:

  1. 装饰;您将每个值都变成一个数组,其中值作为第一个元素,键/索引作为第二个元素
  2. 排序(正常)
  3. 未修饰;你反转步骤 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)

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

关于PHP usort 重新排序数组,排序值对所有数组都相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12163532/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com