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 に答える