【发布时间】:2012-05-22 10:37:57
【问题描述】:
我已经得到了三个字符串,这些字符串是由组合查询和文件读取的漫长过程生成的,每个字符串都相互关联。
示例:
$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 个不同的版本
我执行以下操作:
- 分解字符串
- 复制以版本号为键的数组
- 按键排序数组
- 内爆字符串返回
这是代码和a live example:
$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:
用 array_combine 替换 foreach 循环可能会带来一点性能提升。 – 斯文斯
确实如此,根据a simple unit test 的说法,它快了大约 11-15%。
【问题讨论】:
-
用
array_combine替换foreach循环可能会带来一点性能提升。 -
@svens 确实做到了,它提高了大约 12% 的效率(平均 100 次执行)
-
@ShadowScripter 版本(
$versions中的值)是否唯一?还是同一版本可以多次出现? -
@Yoshi 好问题,
$versions和$ids都是独一无二的。 -
@ShadowScripter 但它们总是整数(例如 1 - n)?
标签: php performance sorting delimiter