0

In my application, I need to build an array which I send to my view to build a google chart.

The final ouput should look like this :

data = google.visualization.arrayToDataTable([
    ['Year', 'Sales', 'Expenses'],
    [2004,  null,      400],
    [2005,  1170,      null],
    [2006,  660,       1120],
    [2023,  1030,      540]
]);

The initial data I have is :

$sales = array(2005=>1170, 2006=>660, 2023=>1030);
$expenses = &array(2004=>400, 2006=>1120, 2023=>540);

How can I adapt this data to the required format ? Of course I need this to be va&lid for any dimension.

I'm a bit lost here cause everything is values in the destination format and I need to populate null values for the years that are not included in my source data.

How can I solve this ?

1
  • 1
    Why not make an array of arrays? Commented Apr 28, 2015 at 16:42

2 Answers 2

1

You can make 3 arrays or make an array, with 3 indexes, of arrays.

<?php

$data = array();
$data['Year'] = array(2004, 2005, 2006, 2023);
$data['Sales'] = array(1000, 1170, 660, 1030);
$data['Expenses'] = array(400, null, 1120, 540);

?>

You can then iterate each row or a column as you need. You can also populate or read out using a FOR loop:

<?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 "]";
?>

If your values are more dynamic, meaning you might not get the same number of indexes in each array, just take a count of each, and set the limiter to that length in your loop. You can then use empty(), to check if the value is there, and replace with null as needed.

Update:

With this type of data set:

$sales = array(2005=>1170, 2006=>660, 2023=>1030);
$expenses = &array(2004=>400, 2006=>1120, 2023=>540);

You have a difficult time aligning the indexes. For example 2005 in one, and 2004 in another, but not in both. I think you need to walk each one, and build a list of indexes from both. Resulting in: 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 "]";
?>
Sign up to request clarification or add additional context in comments.

1 Comment

hi, thanks for you help. I added the source format. That's more complicated then what you used in your example so I can't unfortunately make it work. I'm stuck with populating null values for something that has no keys.
0

Why not have an array of arrays and output that? Something like below should work

$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 "]);";

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.