2010-12-02 5 views
1

現在、カスタム条件セットに基づいてオブジェクトの配列をソートしています。オブジェクト配列の一時ソート

// Array to Sort 
Object 
    $key = value1 
Object 
    $key = value2 
Object 
    $key = value3 
Object 
    $key = value4 

// Comparison Object 
Sorter 
    $data = array('value1', 'value2', 'value4', 'value3'); 

私はループの数を減らそうと、これを行うには簡単に/より高速な方法があるはず考え出しています。データは次のようになります。並べ替えるオブジェクト自体にカスタム値を追加したくないです。これの基本的な考え方は、オブジェクト自体に何もせずに、以前のデータセットからカスタムソートを抽出できることです。

....

を私はなど、array_intersectsのドキュメントに探してみましたが、私はこれを処理する何か良い方法を見つけることができませんでしたここで私は、現在持っているコードです:どのように

$children = array(
    array('key' => 'value1'), 
    array('key' => 'value2'), 
    array('key' => 'value3'), 
    array('key' => 'value4') 
); 

$comparison = array('value1', 'value2', 'value4', 'value3'); 
$sorter = array(); 

// loop 1 -- create a map   
foreach ($children as &$child) { 
    $sorter[] = array(
     'sort' => array_search($child['key'], $comparison, true), 
     'child' => &$child 
    ); 
} 

// loop 2 -- sort based upon the sort key 
usort($sorter, array($this, 'compare')); 

// loop 3 (ugh -- I think this can be done in 2 loops) 
$output = array(); 
foreach ($sorter as &$item) { 
    $output[] = $item['child']; 
} 

// return 
return $output; 

// sort function 
private function compare(Array $a, Array $b) { 
    if( $a['sort'] == $b['sort']) { return 0 ; } 
    return ($a['sort'] < $b['sort']) ? -1 : 1; 
} 

答えて

1

は、これについて?

$children = array(
    array('key' => 'value1'), 
    array('key' => 'value2'), 
    array('key' => 'value3'), 
    array('key' => 'value4') 
); 

// not all values from $children are in there 
$comparison = array('value1', 'value4', 'value3'); 

$ukey = count($comparison); 
$output = array(); 
foreach ($children as $child) { 
    if (($key = array_search($child['key'], $comparison)) !== false) { 
     $output[$key] = $child; 
    } else { 
     // if value is not in $comparison, push it at the end 
     $output[$ukey++] = $child; 
    } 
} 

ksort($output); 
return $output; 

これが返されます:

Array 
(
    [0] => Array 
     (
      [key] => value1 
     ) 
    [1] => Array 
     (
      [key] => value4 
     ) 
    [2] => Array 
     (
      [key] => value3 
     ) 
    [3] => Array 
     (
      [key] => value2 
     ) 
) 
+0

比較対象は、常にそれの元の配列の値を持っていた場合、これは動作します。私の意志は保証されていません - 私は省略された値がまだ含まれているソリューションを好むでしょう。 – ansiart

+0

しかし、あなたの解決策でもそれを考慮していません。値が '$ comparison'にない場合、あなたは何をしたいですか?最後にプッシュしますか?それを除く? PS:PHPでは、配列はオブジェクトではありません。 – netcoder

+0

とにかく、私は答えを更新して、$比較にない値が最後にプッシュされています。 – netcoder