PHP合并两个数组与范围

时间:2014-09-11 18:06:34

标签: php

我有两个数组:

$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)
);

目标,使用以下标准合并两个数组:

  1. 将数组$ b合并到$ a(称为$ result)
  2. 如果$ b中的项与数组$ a中的任何项重叠,则应该删除 $ a的间隔
  3. 任何两个时间间隔相同"开始" &安培; "端"在2)之后,它应该选择较小的值
  4. 我期待的答案:

    $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)
        );
    

    实现这一目标的最佳方法是什么? 谢谢大家。

2 个答案:

答案 0 :(得分:0)

使用array_merge()功能

$result = array_merge($a,$b);

然后使用asort()函数对数组进行排序

答案 1 :(得分:0)

谢谢大家的想法。 我只想出代码并将其发布在这里以防万一有人遇到同样的问题,他们可以参考。

我首先将$ a和$ b组合成单个数组$ tmp_combine,然后根据'begin'对它们进行排序。 构造一个唯一的排序索引数组$ ind,其中包含$ tmp_combine的所有'start'和'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++;  

        }