PHP из MySQL набор результатов для серии для диаграмм? - PullRequest
1 голос
/ 05 октября 2011

Представьте каждую строку как ось X, а каждый столбец - как серию (линию на графике):

---------------------------------
year | apple_price | banana_price
---------------------------------
2010   2.5           1.7
2011   2.6           2.0

array // MySQL results set
  0 => 
    array
      'year' => 2010
      'apple_price' => 2.5
      'banana_price' => 1.7
  1 => 
    array
      'year' => 2011
      'apple_price' => 2.6
      'banana_price' => 2.0

Мне нужно преобразовать массив mysql во что-то более подходящее для моих API диаграмм и JSON. Как бы вы это реализовали? Можно было бы транспонировать набор результатов? РЕДАКТИРОВАТЬ : это, конечно, должно быть динамическим: первый столбец - ось X, остатки будут сериями (линиями на диаграмме) :

array // indexed
  0 => 
    array // associative
      'name' => 'apple_price'
      'data' => [[2010, 2.5], [2011, 2.6]] // indexed array of array
  1 => 
    array // associative
      'name' => 'banana_price'
      'data' => [[2010, 1.7], [2011, 2.0]] // indexed array of array

РЕДАКТИРОВАТЬ : первое быстрое и грязное рабочее решение, пытающееся получить лучшее:

public static function mysqlResultSetToChartSeries($data)
{
    // Return empty array if 0 rows or columns < 2
    if (!isset($data[0]) || !count($data[0]) > 1) return array();

    // Get all keys (columns names)
    $keys = array_keys($data[0]);

    // Temp array for storing col names and values
    $tmp = array();
    foreach($keys as $k) $tmp[$k] = array_map(function($r) use ($k){
        return $r[$k];
    }, $data);

    // X axis
    $x = array_shift($tmp);

    $series = array_map(function($k, $v) use ($x) {
        return array(
            'name' => $k,
            'data' => array_map(function($xaxis, $yaxis) use ($x) {
                return array($xaxis, $yaxis);
            }, array_values($x), $v)
        );
    }, array_keys($tmp), array_values($tmp));

    return $series;
}

1 Ответ

0 голосов
/ 05 октября 2011

Класс:

<?php
class ChartData {

    private $data;
    private $columns;
    private $xAxis;

    /**
     * @param string $xAxis The key of the array that is the x-axis.
     * @param array $columns An array of column names.
     */
    public function __construct($xAxis, array $columns) {
            $this->data = array();
        $this->xAxis = $xAxis;

        //we need to build an index to know how to get
        //from a key to an index.
        $i = 0;
        foreach ($columns as &$key) {
            if ($key != $xAxis) {
                $this->columns[$key] = $i++;
            }
        }
        foreach ($this->columns as $key => &$value) {
            $this->data[$value] = array(
                'name' => $key,
                'data' => array()
            );
        }
    }

    /**
     * @param array $data An associative array mapping data names to values.  Must include the index 'year' and otherwise match $columns
         */
    public function add(array $data) {
        foreach ($data as $key => &$value) {
            if ($key != $this->xAxis) {
                $this->data[$this->columns[$key]]['data'][] = array($data[$this->xAxis], $value);
            }
        }
    }

    /**
     * @return array An associative array in the format for the Charts API.
     */
    public function getArray() {
        return $this->data;
    }

}
?>

Для использования:

$pricesData = array(
    array(
        'year' => '2010',
        'jamba' => '2.5',
        'juice' => '1.7'
    ),
    array(
        'year' => '2011',
        'jamba' => '2.6',
        'juice' => '2.0'
    )
);

$prices = new ChartData('year', array('year', 'jamba', 'juice'));
foreach ($pricesData as &$priceData) {
    $prices->add($priceData);
}
print_r($prices->getArray());

Примечания:

  • Моя реализация требует, чтобы вы указали ей, какой будет ось X. Вы делаете это в конструкторе
  • Он динамический. Вы можете иметь столько столбцов, сколько хотите ..
  • Он предназначен для создания одной записи за раз. Это означает, что вы либо:
    • Передайте каждую запись в цикле выборки из вашей базы данных. (рекомендуется для производительности)
    • Перебрать предварительно созданный массив и передать каждое значение. (показанный пример, не совсем эффективный, отлично разделяет классы)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...