0

我想按以下顺序按多个键对以下数组进行排序:首先按“类型”,然后按“产品”,最后按“名称”。这很容易用 usort 完成,尽管我的客户希望“产品”按特定顺序排序:订书机、活页夹、书。

$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' => '...'
    )
);

有谁知道一个聪明的方法来做到这一点?

4

2 回答 2

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']]
于 2013-01-25T09:48:01.637 回答
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']);
});
于 2013-01-25T09:48:16.970 回答