构建数据集的数组 - 不同的起点?

时间:2013-07-23 15:04:12

标签: php arrays sorting for-loop foreach

我有一组值设置如下:

$array[0]['Year', 'Value']

主阵列内部有100个左右的数组,每个数组都有30个'Year'和'Value'值对。这适用于我当前的所有应用程序,直到我遇到各种图形库,希望它们的数据格式如下:

[x1, y1, y2, y3 ...], [x2, y1, y2, y3 ...], ...

如果我的所有数据点都是从同一年开始的,那么这很容易,但事实并非如此。我的阵列都是从不同的年份开始,并重叠。问题是,如果该X点没有Y轴值,则图形库格式需要'null'值作为该特定系列的地标。

示例:我的$ array [0]从1900-1930开始,我的$ array [1]从1901-1931开始。所以,新数组需要是[1900,$ array [0] ['Value']],null](表示$ array [1]没有值,但仍然是一个系列那么[1901,$ array [0] ['Value'],$ array [1] ['Value']]等等。

我一直在绘制图表并试图围绕创建一系列循环来获取我的旧数组并转换它......但我不知所措。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

首先,你需要定义你的y点,为此我们需要一个范围。在创建数组时,我会有两个变量$minYear$maxYear,然后对于数组中的每个条目,检查它是否小于minYear,或者大于maxYear,如果是,则替换值用这个。

这给了我们最小和最大,现在我们需要一个范围。您需要确定每年之间的点数。为了简单起见,我假设1年是y轴上的一个增量。但是,如果您可以使用y轴上的最大点数,则可以使用以下公式计算每个点之间的年数:

$increment = ($maxYear - $minYear) / $numPointsOnYAxis;

这将为您提供Y轴上每个点之间的年数。为简单起见,您可能希望使用ceil()函数对该数字进行舍入。这意味着你不会使用Y轴上的每一个点,但它可以保持数学的简单和容易。

现在我们有了我们的范围,你可以使用foreach循环来浏览你的数据并绘制图表。

$space = '';
foreach($array as $num => $a) {
    echo $space . '[x' . $num;
    foreach($a as $year => $value) {
        $y = ceil(($value - $minValue) / $increment); //Work out how many increments up the scale the year needs to be.
        echo ', y' . $y;
    }
    echo ']';
    $space = ', ';
}

这应该能够回应你的目标。请注意,我没有测试过此代码。