クエリとファイル読み取りを組み合わせた長いプロセスから生成された3つの文字列があり、それぞれが相互に関連しています。
例:
$versions = "1 2 5 4 10 6 8 7 3 9";
$weights = "50.2 60.5 35 10 15.98 60 50 60.1 70 75";
$ids = "512 318 112 326 155 191 977 961 943 441";
バージョン番号の昇順で並べ替えたいと思います。
結果の例:
$versions = "1 2 3 4 5 6 7 8 9 10";
$weights = "50.2 60.5 70 10 35 60 60.1 50 75 15.98";
$ids = "512 318 943 326 112 191 961 977 441 155";
私の質問は、これを現在行っているよりも効率的な方法はありますか?
これらの文字列は大きくなる可能性があることに注意してください。これまでに見た中で最大のものは、最大600の異なるバージョンです。
私は次のことをします:
- 文字列を爆発させる
- バージョン番号をキーとして配列をコピーする
- キーで配列を並べ替える
- 文字列を元に戻す
これがコードと実際の例です:
$versions = "1 2 5 4 10 6 8 7 3 9";
$weights = "50.2 60.5 35 10 15.98 60 50 60.1 70 75";
$ids = "512 318 112 326 155 191 977 961 943 441";
$a_versions = explode(" ", $versions);
$a_weights = explode(" ", $weights);
$a_ids = explode(" ", $ids);
$s_versions = array();
$s_weights = array();
$s_ids = array();
//set keys to correspond to version number
foreach($a_versions as $key => $ver){
$s_versions[$ver] = $a_versions[$key];
$s_weights[$ver] = $a_weights[$key];
$s_ids[$ver] = $a_ids[$key];
}
//sort according to keys
ksort($s_versions, SORT_NUMERIC);
ksort($s_weights, SORT_NUMERIC);
ksort($s_ids, SORT_NUMERIC);
//implode back
$versions = implode(" ", $s_versions);
$weights = implode(" ", $s_weights);
$ids = implode(" ", $s_ids);
echo "
<pre>
$versions
$weights
$ids
</pre>
";
/*==========
Results
1 2 3 4 5 6 7 8 9 10
50.2 60.5 70 10 35 60 60.1 50 75 15.98
512 318 943 326 112 191 961 977 441 155
==========*/
パフォーマンスの向上#1:
foreachループをarray_combineに置き換えると、パフォーマンスが少し向上する可能性があります。– svens
確かに、単純な単体テストによると、約11〜15%高速です。