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;
}
比較対象は、常にそれの元の配列の値を持っていた場合、これは動作します。私の意志は保証されていません - 私は省略された値がまだ含まれているソリューションを好むでしょう。 – ansiart
しかし、あなたの解決策でもそれを考慮していません。値が '$ comparison'にない場合、あなたは何をしたいですか?最後にプッシュしますか?それを除く? PS:PHPでは、配列はオブジェクトではありません。 – netcoder
とにかく、私は答えを更新して、$比較にない値が最後にプッシュされています。 – netcoder