Php 如何使用CMS中动态输入的数据在Highcharts中构建柱状图 一点背景
注意:在整个问题中,我都会提到。演示图显示了4个主要城市的月降雨量。 我使用WordPress允许用户动态生成Highcharts柱形图 与让用户输入特定城市的所有数据点(12点:每个月一个)不同,我认为让用户输入每个月的数据点(4点:每个城市一个)更直观 在下面的屏幕截图中,您可以看到我如何设置数据输入:用户在左侧输入月份,在右侧输入每个城市的月份降雨量: 然后,用户在页面的单独区域中输入名称并为每个城市选择颜色 问题 在生成的代码中,可以看到数据点按城市分组:Php 如何使用CMS中动态输入的数据在Highcharts中构建柱状图 一点背景,php,arrays,wordpress,foreach,highcharts,Php,Arrays,Wordpress,Foreach,Highcharts,注意:在整个问题中,我都会提到。演示图显示了4个主要城市的月降雨量。 我使用WordPress允许用户动态生成Highcharts柱形图 与让用户输入特定城市的所有数据点(12点:每个月一个)不同,我认为让用户输入每个月的数据点(4点:每个城市一个)更直观 在下面的屏幕截图中,您可以看到我如何设置数据输入:用户在左侧输入月份,在右侧输入每个城市的月份降雨量: 然后,用户在页面的单独区域中输入名称并为每个城市选择颜色 问题 在生成的代码中,可以看到数据点按城市分组: series: [{
series: [{
name: 'Tokyo',
data: [49.9, 71.5, 106.4, ...]
}, {
name: 'New York',
data: [83.6, 78.8, 98.5, ...]
} ...
然而,按照我在WordPress中构建东西的方式,我只能找出如何为每个月生成一个数据点数组,以便得到以下输出:
// array #1
[49.9, 83.6, 48.9, 42.4]
// array #2
[71.5, 78.8, 38.8, 33.2]
// array #3
[106.4, 98.5, 39.3, 34.5]
// array #4
[129.2, 93.4, 41.4, 39.7]
// etc.
// this is perfect!
Array(
[0] => 49.9
[1] => 71.5
[2] => 106.4
[3] => 129.2
)
// missing 1st value
Array(
[0] => 78.8
[1] => 98.5
[2] => 93.4
)
// missing 1st and 2nd values
Array(
[0] => 39.3
[1] => 41.4
)
// missing 1st, 2nd, and 3rd values
Array(
[0] => 39.7
)
问题
如何在每个数组中创建第n个值的数组?换句话说,我不想循环每个月的值,我只想获取每个月的第一个值并将它们放入一个新数组,然后获取每个月的第二个值并将它们放入另一个数组,依此类推
因此,我应该以以下内容结束:
// array #1 (made up of 1st value of each array from above)
[49.9, 71.5, 106.4, 129.2]
// array #2 (made up of 2nd value of each array from above)
[83.6, 78.8, 98.5, 93.4]
// array #3 (made up of 3rd value of each array from above)
[48.9, 38.8, 39.3, 41.4]
// array #4 (made up of 4th value of each array from above)
[42.4, 33.2, 34.5, 39.7]
// etc.
看到我的坏代码(几乎正常工作)
我已经设法接近这个代码
// outer loop: iterate through each month
foreach ( $column_data as $key => $column ) :
// get the X-axis labels (names of the month)
$x_label_array[$key] = $column['label'];
// create an empty array to accept values for each city
${'column_' . $key . '_array'} = array();
// inner loop: iterate through data points for each month
foreach ( $column['columns_4'] as $key_inner => $multi_column ) :
array_push( ${'column_' . $key_inner . '_array'}, (float)$multi_column['value'] );
endforeach;
endforeach;
…但对于每个迭代,它在每个连续数组中跳过一个以上的值,因此我得到以下输出:
// array #1
[49.9, 83.6, 48.9, 42.4]
// array #2
[71.5, 78.8, 38.8, 33.2]
// array #3
[106.4, 98.5, 39.3, 34.5]
// array #4
[129.2, 93.4, 41.4, 39.7]
// etc.
// this is perfect!
Array(
[0] => 49.9
[1] => 71.5
[2] => 106.4
[3] => 129.2
)
// missing 1st value
Array(
[0] => 78.8
[1] => 98.5
[2] => 93.4
)
// missing 1st and 2nd values
Array(
[0] => 39.3
[1] => 41.4
)
// missing 1st, 2nd, and 3rd values
Array(
[0] => 39.7
)
另外,为每个循环使用一个新数组的整个概念看起来相当令人讨厌。有更好的办法吗?这在PHP中是可能的,还是我应该重新构造要求用户输入数据的方式?首先,我喜欢CMS可控图表的想法!这也是我以前做过的事 与让用户输入特定城市的所有数据点(12点:每个月一个)不同,我认为让用户输入每个月的数据点(4点:每个城市一个)更直观 我个人认为这有点违反直觉。如果您添加另一个城市,则会在12个不同的位置弹出一个新的值框。然而,您可以在输入屏幕的末尾有一个很好的ajax过程或其他东西,允许WordPress CMS用户动态添加另一个城市,并在一个地方输入12个新值 无论如何,我不知道你的网站,所以你的方式可以更直观。对于您的特定问题,您可以将阵列数组视为一个矩阵—您只需要将它们正式设置为一个阵列数组,而不是许多单个阵列 然后您可以使用array_map解决您的问题:
$matrix = [
[49.9, 83.6, 48.9, 42.4],
[71.5, 78.8, 38.8, 33.2],
[106.4, 98.5, 39.3, 34.5],
[129.2, 93.4, 41.4, 39.7]
];
array_unshift($matrix, null);
$matrix = call_user_func_array('array_map', $matrix);
对上述PHP过程提供了一个非常好的解释(比我能做的更好!)