В моем приложении мне нужно создать массив, который я отправлю на мой взгляд, чтобы построить Google Chart.
Окончательный результат должен выглядеть следующим образом:
data = google.visualization.arrayToDataTable([
['Year', 'Sales', 'Expenses'],
[2004, null, 400],
[2005, 1170, null],
[2006, 660, 1120],
[2023, 1030, 540]
]);
Исходные данные у меня есть:
$sales = array(2005=>1170, 2006=>660, 2023=>1030);
$expenses = &array(2004=>400, 2006=>1120, 2023=>540);
Как я могу адаптировать эти данные к требуемому формату?
Конечно, мне нужно, чтобы это было&крышка для любого размера.
Я немного растерялся, потому что все это значения в целевом формате, и мне нужно заполнить нулевые значения за годы, которые не включены в мои исходные данные.
Как я могу решить это?
Вы можете сделать 3 массива или сделать массив с 3 индексами из массивов.
<?php
$data = array();
$data['Year'] = array(2004, 2005, 2006, 2023);
$data['Sales'] = array(1000, 1170, 660, 1030);
$data['Expenses'] = array(400, null, 1120, 540);
?>
Затем вы можете перебирать каждую строку или столбец по своему усмотрению. Вы также можете заполнить или прочитать, используя FOR
цикл:
<?php
echo "data = google.visualization.arrayToDataTable([\r\n";
echo "['Year', 'Sales', 'Expenses'],\r\n";
for($i=0;$i<count($data['Year'];$i++)){
echo "[" . $data['Year'][$i] . ", " . $data['Sales'][$i] . ", " . $data['Expenses'] . "],\r\n";
}
echo "]";
?>
Если ваши значения более динамичны, то есть вы можете не получить одинаковое количество индексов в каждом массиве, просто возьмите счетчик каждого из них и установите ограничитель на эту длину в цикле. Вы можете использовать empty()
, чтобы проверить, есть ли значение, и заменить на null
по мере необходимости.
Обновить:
С этим типом набора данных:
$sales = array(2005=>1170, 2006=>660, 2023=>1030);
$expenses = &array(2004=>400, 2006=>1120, 2023=>540);
Вам трудно выровнять индексы. Например 2005 в одном, а 2004 в другом, но не в обоих. Я думаю, что вам нужно пройтись по каждому и составить список индексов из обоих. В результате чего: 2004, 2005, 2006, 2023
,
<?php
$indexes = array();
foreach($sales as $k => $v){
$indexes[] = $k;
}
foreach($expenses as $k => $v){
$indexes[] = $k;
}
sort($indexes);
echo "data = google.visualization.arrayToDataTable([\r\n";
echo "['Year', 'Sales', 'Expenses'],\r\n";
foreach($indexes as $in){
if(empty($sales[$in])){
echo "[$in, null, {$expenses[$in]}],\r\n";
} elseif(empty($expenses[$in])) {
echo "[$in, {$sales[$in]}, null,\r\n";
} else {
echo "[$in, {$sales[$in]}, {$sExpenses[$in]}],\r\n";
}
}
echo "]";
?>
Почему бы не иметь массив массивов и вывести это? Что-то вроде ниже должно работать
$visualizationDataTable = [
['Year', 'Sales', 'Expenses'],
[2004, 1000, 400],
[2005, 1170, null],
[2006, 660, 1120],
[2023, 1030, 540]
];
echo "data = google.visualization.arrayToDataTable([";
foreach($visualizationDataTable as $visualizationDataTableRow) {
echo "[";
foreach($visualizationDataTableRow as $visualizationDataTableColumn) {
if(is_string($visualizationDataTableColumn)) {
echo "'$visualizationDataTableColumn'";
} else if(is_numeric($visualizationDataTableColumn)) {
echo "$visualizationDataTableColumn";
} else if(is_null($visualizationDataTableColumn)) {
echo "null";
}
echo ",";
}
echo "],";
}
echo "]);";