Вызов?преобразование строк MySQL в очень специфический формат с помощью PHP - PullRequest
0 голосов
/ 07 марта 2012

как отформатировать строки сервера sql с помощью php, которые выглядят так:

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]

каждый экземпляр месяца из БД объединяется в один экземпляр.

Company one, имеющая две строки, объединяется в один экземпляр, где каждое значение выстраивается в порядке месяца. Компания два, которая имеет только один экземпляр, имеет значение, определенное как 0, где у нее нет экземпляра в течение месяца.

самое длинное, что я получил, это два двумерных массива с array_merge_recursive и некоторые условные операторы, но затем моя голова переходит в узлы.

1 Ответ

2 голосов
/ 07 марта 2012
SELECT
    company, 
    GROUP_CONCAT(value SEPARATOR ',') AS value, 
    GROUP_CONCAT(monthyear SEPARATOR ',') AS monthyear
FROM
    yourTable
GROUP BY
    company

Некоторые ссылки для GROUP_CONCAT.

PHP-решение:

Выберите сортируемый атрибут для группировки (компания).Зацикливайтесь на них и открывайте новую группу каждый раз, когда вы сталкиваетесь с другой ценностью для компании.Если текущая строка имеет ту же строку, что и предыдущая, добавьте value и monthyear к текущей компании.

Вы можете сделать это даже без сортировки:

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]);
    }
}

Элегантный способ с ООП:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...