我有两个数组:
$a = array(
array("begin"=>0, "end"=>200,"value"=>90),
array("begin"=>200, "end"=>600,"value"=>50),
array("begin"=>600, "end"=>1000,"value"=>90)
);
$b = array(
array("begin"=>-5, "end"=>50,"value"=>10),
array("begin"=>550, "end"=>590,"value"=>30)
);
目标,根据以下条件合并两个阵列:
- 将数组$b合并为$a(称为$result)
- 如果$b中的项与数组$a中的任何项重叠,则应该剪切间隔(以$a为单位)
- 对于具有相同"begin"&"结束"后2),则应选择较小的值
我所期望的答案是:
$result = array(
array("begin"=>-5, "end"=>50,"value"=>10),
array("begin"=>50, "end"=>200,"value"=>90),
array("begin"=>200, "end"=>550,"value"=>50),
array("begin"=>550, "end"=>590,"value"=>30),
array("begin"=>590, "end"=>600,"value"=>50),
array("begin"=>600, "end"=>1000,"value"=>90)
);
实现这一目标的最佳方式是什么?谢谢大家。
使用array_merge()
函数
$result = array_merge($a,$b);
然后使用asort()
函数对数组进行排序
谢谢大家的想法。我只是想出了代码并将其张贴在这里,以防有人有同样的问题,他们可以参考。
我首先将$a和$b组合成一个单独的数组$tmp_combine,并根据"begin"对它们进行排序。构造一个唯一的排序索引数组$ind,该数组包含$tmp_combine的所有"start"answers"end"。然后从$tmp_combine计算每个索引点对的最小值,构造一个数组$ind_SR。
对于$ind_SR中的项数,如果它们连续具有相同的值,则进行合并,并输出$result的最终答案。
$tmp_combine = array_orderby(array_merge($a,$b), 'begin', SORT_ASC);
$ind = array_merge(array_column($tmp_combine, 'begin'),array_column($tmp_combine, 'end'));
$ind = array_unique($ind);
asort($ind);
$ind = array_values($ind);
$index = 0;
$ch_now = $ind[0];
for ($i=0; $i<count($ind)-1; $i++){ //calculate the mid pt min value
$mid_pt = ($ind[$i] + $ind[$i+1]) /2;
array_push($ind_SR, find_min_SR($tmp_combine,$mid_pt));
}
for ($i=0; $i<count($ind_SR); $i++){
if ($ch_now <= $ind[$i]){
$start = $ind[$i];
$end = $ind[$i+1];
$result[$index]['begin'] = $ind[$i];
for ($j=$i; $j<count($ind_SR); $j++){
$start_j = $ind[$j];
$end_j = $ind[$j+1];
if ($ind_SR[$j] == $ind_SR[$i]){
$result[$index]['begin'] = $start;
$result[$index]['end'] = $end_j ;
$result[$index]['value'] = $ind_SR[$i];
$ch_now = $ind[$j+1];
} else{
$result[$index]['end'] = $ind[$j] ;
break; break;
}
}
$index++;
}