在PHP中填充数组,并按升序排列

时间:2016-07-12 07:00:46

标签: php arrays

拥有以下数组:

array(2) {
  [0]=>
  array(4) {
    [0]=>
    array(2) {
      [0]=>
      string(4) "2012"
      [1]=>
      float(1)
    }
    [1]=>
    array(2) {
      [0]=>
      string(4) "2013"
      [1]=>
      float(1)
    }
    [2]=>
    array(2) {
      [0]=>
      string(4) "2014"
      [1]=>
      float(2)
    }
    [3]=>
    array(2) {
      [0]=>
      string(4) "2015"
      [1]=>
      float(1)
    }
  }
  [1]=>
  array(7) {
    [0]=>
    array(2) {
      [0]=>
      string(4) "2008"
      [1]=>
      float(2)
    }
    [1]=>
    array(2) {
      [0]=>
      string(4) "2009"
      [1]=>
      float(7)
    }
    [2]=>
    array(2) {
      [0]=>
      string(4) "2010"
      [1]=>
      float(2)
    }
    [3]=>
    array(2) {
      [0]=>
      string(4) "2011"
      [1]=>
      float(2)
    } // <---------------------------- HERE I MISS YEAR 2012
    [4]=>
    array(2) {
      [0]=>
      string(4) "2013"
      [1]=>
      float(19)
    }
    [5]=>
    array(2) {
      [0]=>
      string(4) "2014"
      [1]=>
      float(8)
    }
    [6]=>
    array(2) {
      [0]=>
      string(4) "2015"
      [1]=>
      float(8)
    }
  }
}

第一个数组是正确的,因为它具有订单年升序,2012201320142015。 第二个数组存在问题,因为您可以看到它错过了2012年。

我想以升序填充所有缺失的年份(并添加一个浮点0),在示例中将值2012推入数组(第二个数组), float值为0

   array(2) {
      [0]=>
      string(4) "2012"
      [1]=>
      float(0)
    }

所以我想要的输出是:

array(2) {
  [0]=>
  array(4) {
    [0]=>
    array(2) {
      [0]=>
      string(4) "2012"
      [1]=>
      float(1)
    }
    [1]=>
    array(2) {
      [0]=>
      string(4) "2013"
      [1]=>
      float(1)
    }
    [2]=>
    array(2) {
      [0]=>
      string(4) "2014"
      [1]=>
      float(2)
    }
    [3]=>
    array(2) {
      [0]=>
      string(4) "2015"
      [1]=>
      float(1)
    }
  }
  [1]=>
  array(7) {
    [0]=>
    array(2) {
      [0]=>
      string(4) "2008"
      [1]=>
      float(2)
    }
    [1]=>
    array(2) {
      [0]=>
      string(4) "2009"
      [1]=>
      float(7)
    }
    [2]=>
    array(2) {
      [0]=>
      string(4) "2010"
      [1]=>
      float(2)
    }
    [3]=>
    array(2) {
      [0]=>
      string(4) "2011"
      [1]=>
      float(2)
    }
    [4]=>
    array(2) {
      [0]=>
      string(4) "2012"
      [1]=>
      float(0)
    }
    [5]=>
    array(2) {
      [0]=>
      string(4) "2013"
      [1]=>
      float(19)
    }
    [6]=>
    array(2) {
      [0]=>
      string(4) "2014"
      [1]=>
      float(8)
    }
    [7]=>
    array(2) {
      [0]=>
      string(4) "2015"
      [1]=>
      float(8)
    }
  }
}

请注意,这是一个很容易的&#39;例如,因为它只错过了一年,但我希望有一个&#39;一般&#39;可以修复它的脚本;按升序填写错过的年份,并将浮点数设为0。

2008200920132014,以填充200820092010 ,. 2011201220132014

这是我的尝试,是arraySeries数组的名称。我一直坚持要做出改变。

foreach ($arraySeries as $value) {
    $i = 0;
    foreach ($value as $innerArray) {
        if ($i == 0) {
                $firstYear = $innerArray[0];
            }
        $year = $innerArray[0];
        if ($year == $firstYear) {
            echo "It's the same year, ok";
        } else {
            echo "Missing year! - Fill value";
            // Do stuff
        }
        var_dump($year);
        $i++;
        $firstYear++;
    }
    echo "<br>";
    $firstYear = null;
}

欢迎任何其他更优雅/更好的性能解决方案。

PS:我使用的是PHP 5.2(它不是我的机器,我无法更新版本)

提前致谢。

1 个答案:

答案 0 :(得分:2)

我想到的第一件事就是从数据中获取年份(缺少年份)。

然后,获得它的最小值和最大值,创建一个完整的年份范围。

比较收集的数据,以便您知道缺失的一年。之后是直接的,添加缺少的年份,然后是通常的排序:

foreach($array as &$first) {
    $years = array_map('reset', $first); // get all years first
    $min = min($years); // min and max
    $max = max($years);
    $year_range = range($min, $max); // create complete years
    $missing_years = array_diff($year_range, $years); // compare both all years to complete range to get the missing
    foreach($missing_years as $y) {
        $first[] = [$y, (float) 0]; // push missing year
    }
    // sort by date
    usort($first, function($a, $b){
        return $a[0] - $b[0];
    });
}

注意:如果您的PHP不支持匿名函数,只需在外部创建一个简单函数并在usort中使用它。