我在使用PHP中的usort()
时遇到了问题。假设我有以下这样一个数组(这只是一个简化版本,实际上是一组对象而不是数组):
$data = array(
array('name' => 'Albert', 'last' => 'Einstein'),
array('name' => 'Lieserl', 'last' => 'Einstein'),
array('name' => 'Alan', 'last' => 'Turing' ),
array('name' => 'Mileva', 'last' => 'Einstein'),
array('name' => 'Hans Albert', 'last' => 'Einstein')
);
正如您所见,该数组是任意排序的。
现在,如果想按last
进行排序,我会这样做:
function sort_some_people($a, $b) { return strcmp($a['last'], $b['last']); }
usort($data, 'sort_some_people');
我有:
Array (
[0] => Array ( [name] => Mileva [last] => Einstein )
[3] => Array ( [name] => Albert [last] => Einstein )
[1] => Array ( [name] => Lieserl [last] => Einstein )
[2] => Array ( [name] => Hans Albert [last] => Einstein )
[4] => Array ( [name] => Alan [last] => Turing )
)
好的,现在它们是按照last
排序的。但正如您所看到的,我刚刚完全失去了先前的排序结果。我的意思是什么?我想保留数组排序为之前的状态,但作为次要排序。希望我表达清楚了。 实际上,我想使用usort()
这样的东西来对数据进行排序(因此,完全自定义排序),但如果两个项目的排序字段相同,则希望将它们的相对位置保持不变。根据给出的示例,我希望Lieserl Einstein
出现在Mileva Einstein
之前,因为一开始就是这样的。
usort()
之前,我在每个对象中存储了原始数组位置(索引)(即$data[$i]->original_index = $i
),然后在我的比较函数中检查了这个值,当第一个比较返回0
(即相同的排序值)时。相当简单而聪明,不是吗? :) 谢谢大家! - lorenzo-s