16

OK、私はすでにこの質問をstackoverflowで受け取りましたが、残念ながらそれはjavascriptにあります-Javascript-別の配列に基づいて配列を並べ替えます

PHPでそれが欲しい

$data = array(
   "item1"=>"1",
   "item2"=>"3",
   "item3"=>"5",
   "item4"=>"2",
   "item5"=>"4"
);

この配列の配置に一致させるには:

sortingArr = array("5","4","3","2","1");

そして私が探している出力:

$data = array(
    "item3"=>"5",
    "item5"=>"4",
    "item2"=>"3",
    "item4"=>"2",
    "item1"=>"1"
 );

これを行う方法はありますか?ありがとう。

4

8 に答える 8

11

詳細な回答については、array_multisort がニーズに合わない理由については、この回答をご覧ください: PHP array_multisort not sort my multidimensional array as expected

つまり、定義済みの順序に基づいて配列を並べ替えたいとします。答えもそこにありますが、この答えにも1つの解決策をコピーしました:

とを使用usortして、インデックス配列(ValueByPosition) をPositionByValuearray_flip配列に変換できるようにします。

    $data = array(
   "item1"=>"1",
   "item2"=>"3",
   "item3"=>"5",
   "item4"=>"2",
   "item5"=>"4"
);

usort($data, "sortByPredefinedOrder");

function sortByPredefinedOrder($leftItem, $rightItem){
  $order = array("5","4","3","2","1");

  $flipped = array_flip($order);

  $leftPos = $flipped[$leftItem];
  $rightPos = $flipped[$rightItem];
  return $leftPos >= $rightPos;   
}

print_r($data);
// usort: Array ( [0] => 5 [1] => 4 [2] => 3 [3] => 2 [4] => 1 )
// uasort: Array ( [item3] => 5 [item5] => 4 [item2] => 3 [item4] => 2 [item1] => 1 )

ただし、これには、事前定義された順序配列内のすべての可能なアイテムを予測するか、他のアイテムを適切な方法でスレッド化する必要があります。

アソシエート キーを保持する場合は、uasort代わりに を使用しusortます。

于 2013-06-27T08:35:05.487 に答える
1

私は自分のソリューションをとても誇りに思っています:

uasort($data, function($a, $b) use ($sortingArr) {  
    return array_search($a, $sortingArr) <=> array_search($b, $sortingArr);
});

作業例: https://3v4l.org/bbIk2

  1. uasortOPが要求したように、キーと値の関連付けを維持するために使用します。(@hassanのエレガントなソリューションとは異なります)
  2. $data 配列のすべての要素が並べ替え配列に存在する必要はありません。(@HamZaのソリューションのように)
  3. 短いです。
  4. より冗長なロジックの代わりに、宇宙船演算子<=>を比較に使用します。

コード:

于 2021-05-04T02:53:00.287 に答える
0

をご覧くださいarray_multisort。実用的な用途を見つけたことがないので(usort用語を明確に定義するために使用することを好みます)、使い方は完全にはわかりませんが、うまくいくかもしれません。

于 2013-06-27T08:19:38.513 に答える