偶然在工作中遇到的一个问题,php如何快速,高效的合并两个有序数组(键名为从0开始的连续整数,比如[1,2,3]),要求合并后的数组有序且键名为从0开始的连续整数(这样*json_encode*之后才不会带上键名)
暂时的解决办法
- 先array_merge,array_merge对于数字键名的数组会将重复值附加到后面
- 在array_unique,此时数组内的值唯一,但是键名依然不连续
- 使用sort函数将数组排序并重新索引。
这样虽然能达到目标,但是做了多余的操作,本来两个数组就是有序的。
思路
可以逐个按序比较值,将较小值push到一个新数组中,重复值只取一次
$a = [1,2,3,4,5,9];
$b = [2,3,4,7,8,9,10];
$c = array();
$min_l = count($a) < count($b) ? count($a) : count($b);
for($i=$j=0;$i<$min_l && $j<$min_l;){
if($a[$i]<$b[$j]){
$c[] = $a[$i];
$i++;
}elseif($a[$i]>$b[$j]){
$c[] = $b[$j];
$j++;
}else{
$c[] = $a[$i];
$i++;
$j++;
}
}
while($i<count($a)){
$c[] = $a[$i++];
}
while($j<count($b)){
$c[] = $b[$j++];
}
var_dump($c);
现在看来这个问题挺好解决的啊,不过前一种方法代码量少,看起来简洁且更好理解。毕竟都用php这脚本语言了,效率肯定不是放在第一位的,快速开发才是最重要的。