私はランダムな順序で私に与えられた配列を持っています。配列は配列の配列で、各サブ配列に存在するキーに基づいて配列を配置する順序が与えられています。配列を既知の順序で並べ替える最も効率的な方法
たとえば、配列array(array('id' => 1), array('id' => 2))
が指定されています。私は各サブ配列のキー 'id'に基づいて配列を順番に並べるように言われています(2,1)。
これをPHPで行う最も効率的な方法は何ですか?
私はランダムな順序で私に与えられた配列を持っています。配列は配列の配列で、各サブ配列に存在するキーに基づいて配列を配置する順序が与えられています。配列を既知の順序で並べ替える最も効率的な方法
たとえば、配列array(array('id' => 1), array('id' => 2))
が指定されています。私は各サブ配列のキー 'id'に基づいて配列を順番に並べるように言われています(2,1)。
これをPHPで行う最も効率的な方法は何ですか?
PHPでは、独自のソート関数を記述することができます。私はこのソリューションの効率を保証することはできませんが、動作し、言語によって直接サポートされるので、私はそれが好きです。次のように
function custom_sort_by_id($a, $b) {
// If the two IDs are the same, no sorting should be done
if ($a['id'] == $b['id']) {
return 0;
}
return ($a['id'] < $b['id']) ? -1 : 1;
}
あなたは、この関数を呼び出します:
usort($myarray, "custom_sort_by_id");
したがって、たとえば、あなたが以下の出発配列を持っている場合:
あなたのケースのためにあなたはこのような何かを書きます
array(3) {
[0]=>
array(2) {
["id"]=> int(3)
["value"]=> int(1)
}
[1]=>
array(2) {
["id"]=> int(2)
["value"]=> int(2)
}
[2]=>
array(2) {
["id"]=> int(1)
["value"]=> int(3)
}
}
次の結果が表示されます。
array(3) {
[0]=>
array(2) {
["id"]=> int(1)
["value"]=> int(3)
}
[1]=>
array(2) {
["id"]=> int(2)
["value"]=> int(2)
}
[2]=>
array(2) {
["id"]=> int(3)
["value"]=> int(1)
}
}
最速の方法は、同じサイズの別の配列を作成し、ランダム配列をループし、idに従って配置することです。
これは、そうでない場合は、あなたが最も低い値とのどちらかを見つけ、それらをループに次々と必要になります
(別名1しかし、多くのがある)のidのが順序であると仮定されますそれを別の値と交換するか、別の一時配列に移動します。
リストがどれほど大きくて、リストが本当に大きい場合は、クイックソートのようなものを使うことができますが、バブルや挿入ソートのような小さなリストの場合はちょうどうまくいきます良い。
私はほとんどのCPU効率的な(あまりにもメモリ効率的であるが)の方法は、2回のパスでそれを行うことであろうと思う:
は、対応するキーを持つ連想配列を作る:
foreach ($array as $item) $ids[$item['id']] = $item;
与えられた順序で結果を構築:
foreach ($order as $id) $result[] = $ids[$id];
効率はデータで何をしているかによって大きく異なるため、これは本当に答えにくいです。最も効率的な方法は、PHP配列がactually ordered mapsであり、が最初のからidキーを持つ配列を作成することを認識することです。
<?php
function add ($needle, &$haystack)
{
$haystack[$needle['id']] = $needle;
}
$map = array();
add (array('id' => 1), $map);
add (array('id' => 10), $map);
add (array('id' => 100), $map);
add (array('id' => 1000), $map);
add (array('id' => 10000), $map);
$order = array(1,10000,10,1000,100);
foreach ($order as $o)
print_r ($map[$o]);
http://php.net/usort – zerkms
foreachの($のオーダー$ Vなど)$結果:また、あなたがランダムな順序に配列を配置する必要がある場合は、通常のソート機能が動作しませんのでご注意[] = array( 'id' => $ v);質問に答えて。 – Alfwed