Php-逐一汇总数组中的数字

时间:2019-03-24 21:56:18

标签: php

我有一个数组;

$arr=array(1100,3150,4430,4430,5170,7450,7450,7450,8230);

我想在图中显示它们。我希望我的Y轴作为该数组的元素,而X轴作为对这些元素的数字求和。 (x1,x1 + x2,x1 + x2 + x3,...)

我的图表将会是

Y-Axis : 1100,3150,4430,4430,5170,7450,7450,7450,8230
X-Axis : 1100,4250,8680,13110,18280,25730,33180,40630,48860

但是我不知道该怎么做。有谁可以帮助我吗?谢谢。

我的整个代码:

<?php
echo " ".'<br>'.'<br>'; 
    $arr=array(1100,3150,4430,4430,5170,7450,7450,7450,8230);
$arrtotal=0;


for($i=0; $i<=8; $i++)
{
    if ($arr[$i]<100) {
    $arr[$i]=$arr[$i];
 }
    else
    {
        $arr[$i]=$arr[$i]/1000;
        $arr[$i]=(string)$arr[$i];
    }
}

function calculate($arr, $output){

        switch($output){
            case 'mean':
                $count = count($arr)+1;
                $sum = array_sum($arr);
                $total = $sum / $count;
            break;
            case 'median':
                rsort($arr);
                $middle = (count($arr) / 2)+1;
                $total = $arr[$middle-1];
            break;
            case 'mode':
                $v = array_count_values($arr); 
                arsort($v); 
                foreach($v as $k => $v){$total = $k; break;}

            break;

        }
        return $total;
    }

function sd_square($x, $total) { return pow($x - $total,2); }
function sd($arr) {
    return sqrt(array_sum(array_map("sd_square", $arr, array_fill(0,count($arr), (array_sum($arr) / count($arr)) ) ) ) / (count($arr)-1) );
}

echo '  '.'<br>';
echo "Values: ";
echo json_encode($arr).'<br>';
echo 'Mean: '.calculate($arr, 'mean').'<br>';
echo 'Median: '.calculate($arr, 'median').'<br>';
echo 'Mode: '.calculate($arr, 'mode').'<br>';
echo "Standart Derivation: ".sd($arr);
?>


<!DOCTYPE HTML>
<html>
<head>
<script>
window.onload = function () {

var data = <?php echo json_encode($arr, JSON_NUMERIC_CHECK); ?>;
data = data.map(function (row, index) {
    return {
        x: index,
        y: row
    };
});

var chart = new CanvasJS.Chart("chartContainer", {
    title: {
        text: "Analysis"
    },
    axisY: {
        title: "Variables"
    },
    data: [{
        type: "line",
        dataPoints: data
    }]
});
chart.render();

}

</script>
</head>
<body>

<div id="chartContainer" style="height: 250px; width: 50%;"></div>
<script src="https://canvasjs.com/assets/script/canvasjs.min.js"></script>
</body>
</html>

在这段代码中,我的X轴是(0,1,2,3,4,5,6,7,8),我不想要那样。

对不起,如果我不能很好地解释,英语不是我的母语。

2 个答案:

答案 0 :(得分:2)

最简单的方法是遍历值,将当前数组值添加到先前的输出值以创建新的输出值。然后,您可以使用array_combine将其转换为[x => y]值的数组:

$arr=array(1100,3150,4430,4430,5170,7450,7450,7450,8230);
$out = array($arr[0]);
for ($i = 1; $i < count($arr); $i++) {
    $out[$i] = $out[$i-1] + $arr[$i];
}
$arr = array_combine($out, $arr);
print_r($arr);

输出:

Array (
  [1100] => 1100
  [4250] => 3150
  [8680] => 4430
  [13110] => 4430
  [18280] => 5170
  [25730] => 7450
  [33180] => 7450
  [40630] => 7450
  [48860] => 8230
)

Demo on 3v4l.org

答案 1 :(得分:2)

要将一个数组转换为2个图形坐标数组,可以执行以下操作:

$x = array();
$y = array();
$running_total = 0;
for($i = 0; $i < count($arr); $i++){
    $y[$i] = $arr[$i];
    $running_total += $arr[$i];
    $x[$i] = $running_total;
}

这将给您两个数组;数组$ x包含X坐标列表,数组$ y给出Y坐标列表;并且您仍然可以访问原始的$ arr数组,如果需要对其进行进一步的计算。根据您的问题,我认为,它将为您提供所需的东西。

但是,如果您要使用1个数组,其中X坐标是数组索引,并且值是数组值本身,例如$ y [3150] = 4250,那么这是不可能的;因为您的原始列表中有重复项,所以您不能将这些值用作数组索引,除非最终覆盖它们。

(至少,并非并非使每个数组值本身都是一个数组,但这会使事情比可能需要的地方多一个数量级)