我正在使用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的案例.
原文链接:https://www.f2er.com/php/135032.html它基本上包括三个步骤:
>装饰;将每个值转换为数组,其值为第一个元素,键/索引为第二个元素
>排序(按照正常情况)
> 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)
这是保持数组正确顺序的原因.并且,不需要递归:)