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条)

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站