使用PHP计算数组的平均值?

时间:2013-12-19 11:45:03

标签: php arrays sorting average

我的头脑正在爆炸。我似乎无法创建一个有效的解决方案。

我有这种格式的文件:

99895|35378|0.01
99895|813|-0.97
99895|771|0.29
442|833|-1.06
442|485|-0.61
442|367|-0.14
442|478|0.77
442|947|-0.07
7977|987|0.76
7977|819|0.37
7977|819|0.36
7977|653|1.16
7977|1653|1.15

我想计算第一列中每个id的第三列的平均值。

这看起来很容易,但我无法让它发挥作用。如何从第一列中获得任何所述ID的平均值?

编辑:

我以前写的一些示例代码:

$file = file_get_contents("results.txt");


$file = explode("
", $file);

$howMany = count($file);

for($a = 0;$a<$howMany;$a++)
{

$row = explode("|", $file[$a]);
$id = $row[0];



$howManyAlready = count($bigTable[$id]);

$bigTable[$id][$howManyAlready] = $row[2];

}

我添加了代码。到目前为止,它将结果转换为数组(偏移量与其id相对应)但是我在如何获取这些结果并计算每个id的平均值然后将其显示在屏幕上时遇到了问题。

7 个答案:

答案 0 :(得分:4)

这样的事情肯定会有用......

<?php
$arr=array();
$arrv=array_filter(file('myfile.txt'),'strlen');
foreach($arrv as $v)
{
    array_push($arr,@array_pop(explode('|',$v)));
}
echo $avg = array_sum($arr)/count($arr);

答案 1 :(得分:1)

您可以尝试这样做:

$file = file_get_contents("results.txt");
$file = explode("
", $file);

$valuesPerID = Array();

foreach($file as $row)
{

    $row_array = explode("|", $row);

    $id = $row_array[0];

    if(!array_key_exists($id, $valuesPerID))
    {
        $valuesPerID[$id] = Array();
    }

    $valuesPerID[$id][] = $row_array[2];

}

现在在$ valuesPerID数组中,您将拥有所有ID作为键,并且对于每个ID,所有值都与所述ID相关联。他们可以轻松计算出这些值的平均值!

答案 2 :(得分:1)

您可以使用数组映射来分配值和ID。 例如(假设您已经处理了文本):

<?php
    $data = array("99895|35378|0.01",
        "99895|813|-0.97",
        "99895|771|0.29",
        "442|833|-1.06",
        "442|485|-0.61",
        "442|367|-0.14",
        "442|478|0.77",
        "442|947|-0.07",
        "7977|987|0.76",
        "7977|819|0.37",
        "7977|819|0.36",
        "7977|653|1.16",
        "7977|1653|1.15");

    $bucket = array();
    $count = array();
    foreach($data as $line) {
        list($id, $what_s_this, $number) = explode("|", $line);
        $count[$id]++;
        $bucket[$id]+= (float)$number;
    }

    foreach($bucket as $id => $sum) {
        echo "id:". $id. ", average". $sum / $count[$id]. "\n";
    }

答案 3 :(得分:1)

这里有一些我刚才写的东西。

在我的例子中,它是从字符串中获取的。

<?php
$test1 = "";
$test2 = "";
$count1 = 0;
$count2 = 0;
$string = "99895|35378|0.01
99895|813|-0.97
99895|771|0.29
442|833|-1.06
442|485|-0.61
442|367|-0.14
442|478|0.77
442|947|-0.07
7977|987|0.76
7977|819|0.37
7977|819|0.36
7977|653|1.16
7977|1653|1.15";

$d = explode("\n", $string);
foreach ($d as $k => $v)
{
    $d2 = explode("|", $v);

    if ($d2[0] == '99895'){
        $count1++;
        $test1 += $d2[2];
    }
    if ($d2[0] == '442'){
        $count2++;
        $test2 += $d2[2];
    }
}

$result1 = $test1 / $count1;
$result2 = $test2 / $count2;

echo $result1. " <br> ". $result2;

我不知道这会有多好用,因为我不知道这些值是否已设定。

答案 4 :(得分:1)

这应该会让你走上正轨。

<?php
$values = array();

foreach (file('file.txt') as $line) {
    list($id, $thingymabob, $value) = explode('|', $line);

    if ( ! array_key_exists($id, $values)) {
        $values[ $id ] = array();
    }

    array_push($values[ $id ], $value);
}

foreach ($values as $id => $value) {
    printf(
        "%d has an average of %f\n",
        $id,
        array_sum($value) / count($value)
    );
}

答案 5 :(得分:1)

试试这个:

$filename = 'results.txt';
$result = $counter = $values = array();

$file = fopen($filename, 'r') or die("Couldn't open $filename");
while ($line = fgets($file)) {
    $content = explode('|', $line);
    if (empty($content[0]) or empty($content[2]))
        continue;

    $values[$content[0]][] = (float) $content[2];
    ++$counter[$content[0]];
}

foreach ($values as $key => $value) {
    $result[$key] = array_sum($value) / $counter[$key];
}
fclose($file);

答案 6 :(得分:1)

如果您尝试以下代码

<?php
$file_content = array();
$handle = fopen("test.txt", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        // process the line read.
        $line_ex = explode("|",$line);
        array_push($file_content,$line_ex);
    }
} else {
    // error opening the file.

}

echo "<pre>";
    print_r($file_content);
    echo "<pre>";
?>

然后你会得到低于输出

Array
(
[0] => Array
    (
        [0] => 99895
        [1] => 35378
        [2] => 0.01

    )

[1] => Array
    (
        [0] => 99895
        [1] => 813
        [2] => -0.97

    )

[2] => Array
    (
        [0] => 99895
        [1] => 771
        [2] => 0.29

    )

[3] => Array
    (
        [0] => 442
        [1] => 833
        [2] => -1.06

    )

[4] => Array
    (
        [0] => 442
        [1] => 485
        [2] => -0.61

    )

[5] => Array
    (
        [0] => 442
        [1] => 367
        [2] => -0.14

    )

[6] => Array
    (
        [0] => 442
        [1] => 478
        [2] => 0.77

    )

[7] => Array
    (
        [0] => 442
        [1] => 947
        [2] => -0.07

    )

[8] => Array
    (
        [0] => 7977
        [1] => 987
        [2] => 0.76

    )

[9] => Array
    (
        [0] => 7977
        [1] => 819
        [2] => 0.37

    )

[10] => Array
    (
        [0] => 7977
        [1] => 819
        [2] => 0.36

    )

[11] => Array
    (
        [0] => 7977
        [1] => 653
        [2] => 1.16

    )

[12] => Array
    (
        [0] => 7977
        [1] => 1653
        [2] => 1.15
    )

)

为了确定相应第一栏第三栏的平均值 - 我正在研究它。当我完成后,我会把它放在这里。