拥有以下数组:
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)
}
}
}
第一个数组是正确的,因为它具有订单年升序,2012
,2013
,2014
和2015
。
第二个数组存在问题,因为您可以看到它错过了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。
2008
,2009
,2013
,2014
,以填充2008
,2009
,2010
,. 2011
,2012
,2013
,2014
。
这是我的尝试,是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(它不是我的机器,我无法更新版本)
提前致谢。
答案 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
中使用它。