dongpi3237 2013-01-25 09:41
浏览 63
已采纳

按特定顺序按多个键对数组进行排序

I want to sort the following array by multiple keys in the following order: First by "type", then "product", and lastly by "name". This is pretty easily done with usort, although my clients wants "product" sorted in a specific order: 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' => '...'
    )
);

Does anyone know a clever way to accomplish this?

  • 写回答

2条回答 默认 最新

  • dongzan2740 2013-01-25 09:48
    关注
    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']);
    });
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?