一个挑战?使用php将mysql行转换为非常特定的格式

时间:2012-03-07 06:40:08

标签: php highcharts

如何使用如下所示的php格式化sql server行:

id     company         value      monthyear
1      companyone      30         january2012
2      companytwo      20         february2012
3      companyone      10         february2012

进入这个:

monthyear: ['january2012', 'february2012']

和此:

company: 'companyone', value: [30, 10]
company: 'companytwo', value: [0, 20]

数据库中每个月的一个实例合并为一个实例。

公司1,有两行,合并为一个实例,每个值按月排列。公司二,只有一个实例,它的值定义为0,一个月内没有实例。

我得到的最远的是带有array_merge_recursive和一些条件语句的两个二维数组,但后来我的头进入了结。

1 个答案:

答案 0 :(得分:2)

SELECT
    company, 
    GROUP_CONCAT(value SEPARATOR ',') AS value, 
    GROUP_CONCAT(monthyear SEPARATOR ',') AS monthyear
FROM
    yourTable
GROUP BY
    company

GROUP_CONCAT的一些参考。

PHP解决方案:

选择要分组的属性(公司)。每次遇到公司的不同价值时,循环遍历它们并打开一个新组。只要当前行与上一行具有相同的行,就可以将valuemonthyear添加到当前公司。

即使没有排序,你也可以这样做:

while($row = mysql_fetch_assoc($resource))
{
    $values[$row["country"]][] = $row["value"];
    $monthyear[$row["country"]][] = $row["monthyear"];
}

一些输出示例

foreach ($values as $country => $valuesOneCountry)
{
    // each country
    var_dump($country);

    foreach ($valuesOneCountry as $i => $value)
    {
        // value, monthyear for each original row

        var_dump($value, $monthyear[$country][$i]);
    }
}

使用OOP的优雅方式:

class Tuple
{
    public $country, $values, $monthyears;

    public function __construct($country, $values = array(), $monthyears = array())
    {
        $this->country = $country;
        $this->values = $value;
        $this->monthyears = $monthyears;
    }
}

$tuples = array();
while($row = mysql_fetch_assoc($resource))
{
    if (!isset($tuples[$row["country"]]))
         $tuples[$row["country"]] = new Tuple($row["country"]);

    // save reference for easy access        
    $tuple = $tuples[$row["country"]];

    // or some method like $tuple->addValue($row["value"]);
    $tuple->values[] = $row["value"];
    $tuple->monthyears[] = $row["monthyear"];
}

var_dump($tuples);