我想按以下顺序按多个键对以下数组进行排序:首先是“type”,然后是“product”,最后是“name”。虽然我的客户希望“产品”按特定顺序排序,但很容易用usort完成:Stapler,Binder,Book。
$arr = array(
array(
'type' => 'School',
'product' => 'Book',
'name' => 'My book',
'data' => '...'
),
array(
'type' => 'Job',
'product' => 'Stapler',
'name' => 'My stapler',
'data' => '...'
),
array(
'type' => 'Personal',
'product' => 'Binder',
'name' => 'My binder',
'data' => '...'
),
array(
'type' => 'School',
'product' => 'Book',
'name' => 'My book',
'data' => '...'
)
);
有谁知道一个聪明的方法来实现这个目标?
答案 0 :(得分:1)
usort并不限制您这样做。我假设您的问题是如何比较排序回调函数中的product
值。这可以通过地图完成,例如:
$mapProductOrder = array_flip(array('Stapler', 'Binder', 'Book'));
// same as: array('Stapler' => 0, 'Binder' => 1, 'Book' => 2)
比较$item1
和$item2
使用:
$mapProductOrder[$item1['product']] < $mapProductOrder[$item2['product']]
答案 1 :(得分:1)
usort($arr, function ($a, $b) {
// by type
$r = strcmp($a['type'], $b['type']);
if ($r !== 0) {
return $r;
}
// by product
// note: one might want to check if `$a/$b['product']` really is in `$order`
$order = array('Stapler', 'Binder', 'Book');
$r = array_search($a['product'], $order) - array_search($b['product'], $order);
if ($r !== 0) {
return $r;
}
// or similar, with a little help by @fab ;)
/*
$order = array('Stapler' => 0, 'Binder' => 1, 'Book' => 2);
$r = $order[$a['product']] - $order[$b['product']];
if ($r !== 0) {
return $r;
}
*/
// name
return strcmp($a['name'], $b['name']);
});