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的案例.
它基本上包括三个步骤: >装饰;将每个值转换为数组,其值为第一个元素,键/索引为第二个元素 这是(我已经将它调整到您的特定用例): 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) 这是保持数组正确顺序的原因.并且,不需要递归:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |