Php 如何使用CMS中动态输入的数据在Highcharts中构建柱状图 一点背景

Php 如何使用CMS中动态输入的数据在Highcharts中构建柱状图 一点背景,php,arrays,wordpress,foreach,highcharts,Php,Arrays,Wordpress,Foreach,Highcharts,注意:在整个问题中,我都会提到。演示图显示了4个主要城市的月降雨量。 我使用WordPress允许用户动态生成Highcharts柱形图 与让用户输入特定城市的所有数据点(12点:每个月一个)不同,我认为让用户输入每个月的数据点(4点:每个城市一个)更直观 在下面的屏幕截图中,您可以看到我如何设置数据输入:用户在左侧输入月份,在右侧输入每个城市的月份降雨量: 然后,用户在页面的单独区域中输入名称并为每个城市选择颜色 问题 在生成的代码中,可以看到数据点按城市分组: series: [{

注意:在整个问题中,我都会提到。演示图显示了4个主要城市的月降雨量。

我使用WordPress允许用户动态生成Highcharts柱形图

与让用户输入特定城市的所有数据点(12点:每个月一个)不同,我认为让用户输入每个月的数据点(4点:每个城市一个)更直观

在下面的屏幕截图中,您可以看到我如何设置数据输入:用户在左侧输入月份,在右侧输入每个城市的月份降雨量:

然后,用户在页面的单独区域中输入名称并为每个城市选择颜色

问题 在生成的代码中,可以看到数据点按城市分组:

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过程提供了一个非常好的解释(比我能做的更好!)