Усреднение столбца в массиве php - PullRequest
0 голосов
/ 27 марта 2020

У меня есть текстовый файл с разделителями табуляции, который выглядит следующим образом: http://realmonitor.com/nick-stuff/210320.AVG.txt

Я могу получить его в массив ОК: http://realmonitor.com/nick-stuff/avg.php

, но не могу понять, как усреднить значения по столбцам.

Попытка получить среднее значение для значений, отображаемых под каждым из заголовков - 593, 594, 595 и т. Д. c.

Любая помощь будет принята с благодарностью!

Мой код для загрузки файла в массив:

<code>    <?php

    $file = "210320.AVG.txt";// Your Temp Uploaded file
    $nowavg = array();
    $cols2 = array();
    ini_set('auto_detect_line_endings', true);

    $fh = fopen($file, 'r');
    $i = 0;

    while (($line = fgetcsv($fh, 1000, "\t")) !== false) {
      $nowavg[] = $line;

       }

    $j = 1;

    for ($j = 8; $j != 23; $j++)   {

    $cols2[$j][0] = $nowavg[$j][0];

    // $j++;

       }

    echo "<pre>";
    print_r($nowavg); 
    echo "
"; echo"
";
    print_r($cols2); 
    echo "
";?>

Добавлено для ясности после комментариев:

Правильно. Думаю, мне тоже не хотелось бы нажимать на ссылки.

Вот как выглядит файл AVG:

593 594 595 611 612 613 1214    1215    1216    1547    1548    1549    1565    1566    1567    

03: 59: 49 1827 1796 1784 1992 1922 1939 1968 1925 1910 2210 2231 2254 1751 1755 1751
04:59:47 1893 1863 1835 2048 2000 2030 1955 1908 1901 2254 2222 2237 1801 1791 1792
05:59:39 2021 1990 1981 2060 2022 2038 2032 1986 1967 2252 2233 2248 1777 1790 1794
06:59:45 2042 1979 1957 2116 2077 2084 2050 1988 1979 2256 2232 2241 1848 1852 18 56
07:59:44 2047 2000 1995 2124 2105 2112 2068 2021 2004 2217 2158 2145 1871 1896 1891
08:59:46 2081 2048 2023 2123 2127 2107 2019 1972 1966 2204 2176 2202 1827 1841 1851
09:59:43 2080 2045 2019 2135 2130 2132 2044 2001 1990 2232 2192 2220 1783 1842 1796
10:59:47 2101 2070 2011 2144 2156 2143 1995 1957 1941 2237 2203 2225 1798 1883 1820
11:59: 48 2108 2139 2055 2141 2171 2137 2049 2002 1975 2160 2134 2200 1780 1864 1796
12:59:48 2084 2165 2030 2101 2152 2082 2096 2057 2044 2167 2139 2200 1756 1902 1754
13:59:56 1878 2130 1804 2056 2067 2011 1878 1874 1845 2165 2148 2160 1732 1950 1714
14:59:52 1784 1868 1784 1812 1821 1799 1963 1932 1893 2021 1978 2023 1580 1728 1560
15:59:51 1732 1746 1755 1807 1814 1819 1953 1902 1864 1846 1808 1814 1551 1559 1539
16:59:53 1609 1615 1620 1617 1623 1620 1877 1824 1803 1802 1746 1766 1542 1546 1524
17:59:13 1588 1594 1594 1609 1611 1609 1753 1730 1691 1778 1749 1731 1523 1543 1511

И вот что я хотел бы увидеть:

593 594 595 ... 2000 2134 1985

Где первая строка желаемого результата - строка заголовка файла AVG а строка ниже представляет собой среднее значение каждого столбца чисел в файле AVG.

1 Ответ

0 голосов
/ 27 марта 2020

Этот код пытается уменьшить обработку и промежуточное хранение значений. Он считывает файл и поддерживает промежуточный итог для каждого столбца, а также количество строк.

Сначала извлекает строку заголовка с 593 et ​​c. (удаляет пустое поле спереди), затем читает каждую строку. Каждое значение затем суммируется и после l oop выводит заголовок с итогом, деленным на количество строк ...

$fh = fopen($file, 'r');

$headings = fgetcsv($fh, null, "\t");
array_shift($headings);
$totals = array_fill(0, count($headings), 0);
$rows = 0;
while (($line = fgetcsv($fh, null, "\t")) !== false) {
    array_shift($line);
    foreach ( $line as $position => $value )    {
        $totals[$position] += $value;
    }
    $rows ++;
}

foreach ( $headings as $position => $name ) {
    echo $name. "=" . ( $totals[$position] / $rows ).PHP_EOL;
}

, что дает ...

593=1925
594=1936.5333333333
595=1883.1333333333
611=1992.3333333333
612=1986.5333333333
613=1977.4666666667
1214=1980
1215=1938.6
1216=1918.2
1547=2122.6
1548=2089.9333333333
1549=2111.0666666667
1565=1728
1566=1782.8
1567=1729.9333333333
=0
...