从CSV转换为字典(PHP)

vhmi4jdf  于 2023-02-20  发布在  PHP
关注(0)|答案(1)|浏览(104)

我需要编写一个函数,它将温度作为输入,并返回一个字典,字典的键为年份,值为天数。
CSV文件(年、月、日、小时、温度):

2019,1,1,0,0.1
2019,1,1,1,0.4
2019,1,1,2,0.8
2019,1,1,3,1.3
2019,1,1,4,1.8
...
2020,1,1,0,-3.9

天数是由另一个函数计算的,我已经有了这个函数。它需要一年和一个温度,然后返回给定年份中温度等于或低于给定温度的天数。由于数据是关于小时而不是天的,所以找到小时数,然后除以24。
该功能:

function getDaysUnderTemp(int $targetYear, float $targetTemp): float {

    $file = fopen("data/temperatures-filtered.csv", "r");
    $hours = 0;

    while ($data = fgetcsv($file)) {
        if ($data[0] == $targetYear and $data[4] <= $targetTemp) {
            $hours ++;
        }
    }

    fclose($file);
    return $hours / 24;
}

例如,getDaysUnderTemp(2019, -10)返回13.92
这是一个功能,我问,因为我不知道它可能是怎么做的:

function getDaysUnderTempDictionary(float $targetTemp): array {
    $file = fopen("data/temperatures-filtered.csv", "r");

    while ($data = fgetcsv($file)) {
        ???
    }
    
    fclose($file);
    return [];
}

问题是我不明白如何在这个新函数中实现一个已经编写好的函数,然后从所有这些数据中创建一个所需的字典。
预期输出:

getDaysUnderTempDictionary(-10);

Array
(
    [2019] => 3.88
    [2020] => 0.21
    [2021] => 13.92
)
rkkpypqq

rkkpypqq1#

如果我这样做,我会以原始形式将所有数据读入一个数组,然后生成我需要的任何其他结构。
我将把它写成一个类:

class TempCalculator {
    private $data;
    private $arr;

    const YEAR = 0;
    const TEMP = 4;

    public function __construct($filename) {
        $this->data = array_map('str_getcsv', file($filename));
    }

    public function getHoursBelowTemperature($temperature) : array {
        $this->arr = array();

        foreach ($this->data as $row) {
            $year = $row[self::YEAR];
            $temperatureValue = floatval($row[self::TEMP]);
            if ($temperatureValue < $temperature) {
                if (!array_key_exists($year, $this->arr)) {
                    $this->arr[$year] = 0;
                }
                $this->arr[$year]++;
            }
        }
        // Walk the array and divide all the hours by 24
        array_walk($this->arr, function (&$value) {
            $value /= 24;
        });
        return $this->arr;
    }

    public getDaysUnderTemp($year, $temp) : float {
        $hours = 0;
        foreach ($this->data as $row) {
            if ($row[self::YEAR] == $targetYear && $row[self::TEMP] <= $targetTemp) {
                $hours ++;
            }
        }
        return $hours / 24;
    }    
}

你可以这样称呼它:

$tempCalculator = new TempCalculator('temperatures.csv');
$result = $tempCalculator->getHoursBelowTemperature(0);
print_r($result);

$result2 = $tempCalculator->getDaysUnderTemp(1.5);
print_r($result);

相关问题