2011-09-12 10 views
1

私はランダムな順序で私に与えられた配列を持っています。配列は配列の配列で、各サブ配列に存在するキーに基づいて配列を配置する順序が与えられています。配列を既知の順序で並べ替える最も効率的な方法

たとえば、配列array(array('id' => 1), array('id' => 2))が指定されています。私は各サブ配列のキー 'id'に基づいて配列を順番に並べるように言われています(2,1)。

これをPHPで行う最も効率的な方法は何ですか?

+0

http://php.net/usort – zerkms

+0

foreachの($のオーダー$ Vなど)$結果:また、あなたがランダムな順序に配列を配置する必要がある場合は、通常のソート機能が動作しませんのでご注意[] = array( 'id' => $ v);質問に答えて。 – Alfwed

答えて

1

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) 
    } 
} 
0

最速の方法は、同じサイズの別の配列を作成し、ランダム配列をループし、idに従って配置することです。

これは、そうでない場合は、あなたが最も低い値とのどちらかを見つけ、それらをループに次々と必要になります

(別名1しかし、多くのがある)のidのが順序であると仮定されますそれを別の値と交換するか、別の一時配列に移動します。

リストがどれほど大きくて、リストが本当に大きい場合は、クイックソートのようなものを使うことができますが、バブルや挿入ソートのような小さなリストの場合はちょうどうまくいきます良い。

http://en.wikipedia.org/wiki/Sorting_algorithm

0

私はほとんどのCPU効率的な(あまりにもメモリ効率的であるが)の方法は、2回のパスでそれを行うことであろうと思う:

  1. は、対応するキーを持つ連想配列を作る:

    foreach ($array as $item) $ids[$item['id']] = $item; 
    
  2. 与えられた順序で結果を構築:

    foreach ($order as $id) $result[] = $ids[$id]; 
    
0

効率はデータで何をしているかによって大きく異なるため、これは本当に答えにくいです。最も効率的な方法は、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]); 
関連する問題