[英]How to turn a Postgres result with varying number of results into an ordered list in PHP
我有两张桌子,一张有国家名单。 另一个带有给定变量的年份和值的列表。
第二个表仅保存某些年份的条目,这些条目因国家/地区而异。 因此,当我加入表格(以获取国家名称,未在下面的列表中显示)时,结果的确如下所示:
id_country year_start value_ori
886 2002 161.348
886 2003 161.348
886 2004 176.016
886 2005 176.016
886 2006 179.683
886 2007 183.35
886 2008 201.685
886 2009 227.354
886 2010 234.688
886 2011 245.689
886 2012 293.36
886 2013 440.04
620 1990 40.337
620 1991 1056.096
620 1992 1151.438
620 1993 1389.793
620 1994 1584.144
620 1995 1631.815
620 1996 1749.159
620 1997 1796.83
620 1998 1906.84
620 1999 1664.818
620 2000 1642.816
620 2001 2016.85
620 2002 1760.16
620 2003 1873.837
620 2004 1961.845
620 2005 2310.21
620 2006 2328.545
620 2007 2361.548
620 2008 3329.636
620 2009 3069.279
620 2010 3098.615
620 2011 2823.59
620 2012 3373.64
620 2013 2948.268
也就是说,对于886国家而言,我没有早于2002年的价值。
现在,我想用此列表创建一个CSV,该列表应在下一年之后的一年中连续列出每个国家/地区的值-如表格。 这意味着,如果某些年份没有值,则应该有一个空格(或“ null”),如下所示:
1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013
620 40.337 1056.096 1151.438 1389.793 1584.144 1631.815 1749.159 1796.83 1906.84 1664.818 1642.816 2016.85 1760.16 1873.837 1961.845 2310.21 2328.545 2361.548 3329.636 3069.279 3098.615 2823.59 3373.64 2948.268
886 161.348 161.348 176.016 176.016 179.683 183.35 201.685 227.354 234.688 245.689 293.36 440.04
现在,我无法成功编写一个循环,该循环将处理那些无效的“值”。 至少不是一个顺利的。 我可以检索所有可用的年份,然后针对每个年份和国家/地区启动查询。 或使用结果构建三维数组,然后将其用于循环。 但这看起来像是奇怪的编程。
我希望对使用几行干净的PHP如何实现此目标发表任何评论。
循环查找找到的年份的最小值和最大值,同时循环(内部)查找到的所有公司,这将使您创建csv行,而不会丢失任何年份或公司:
$company_ids = array();
$company_data = array();
$year_min = $year_max = 2016;
$year_fld = 'year_start';
$comp_fld = 'id_country';
$data_fld = 'value_ori';
foreach ($data as &$d) {
$company_ids[$d[$comp_fld]] = $d[$comp_fld];
$d[$year_fld] = (integer) $d[$year_fld];
if ($year_min > $d[$year_fld]) $year_min = $d[$year_fld];
if ($year_max < $d[$year_fld]) $year_max = $d[$year_fld];
$company_data[$d[$year_fld]][$d[$comp_fld]] = $d[$data_fld];
}
//die("$year_min $year_max");
//ksort($company_data);
//die('<pre>'.print_r($company_data,true));
$csv_rows = array();
for ($year=$year_min; $year<$year_max+1; $year++) {
// print rows or accumulate them, whatever
foreach ($company_ids as &$cid) {
$csv_rows[$year][$cid] = (empty($company_data[$year][$cid])) ? '' : $company_data[$year][$cid];
}
}
die('<pre>'.print_r($csv_rows,true));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.