【问题标题】:How to save extra csv row of data in to an array如何将额外的csv行数据保存到数组中
【发布时间】:2021-02-19 13:24:01
【问题描述】:

我有一个 csv 上传功能,可以保存到我的数据库表中。我想修改它以读取额外的数据行并相应地格式化数组。

表格将如下所示:

Date Cost Type 1 Cost Type 2 Cost Type 3
£50.00 £10.00 £90.00
01/01/21 1 3 10
02/01/21 5 4 12

我正在根据每个数字节省成本标题。因此,在我开始保存实际数据之前,我想读取每种类型的成本价格并将其保存到我的数组中。

$formattedArray = [];
foreach($the_array as $element) {
  $formattedArray[] = [
    "cost" => array_keys($element)[0],
    "demand" => array_values($element)[0],
  ];
}

最终的数组应该是这样的:

array(
  [0] => Array
    (
        [date] => 01/01/21
        [cost] => Cost Type 1
        [demand] => 1
        [total] => £50.00
    )
[1] => Array
    (
        [date] => 01/01/21
        [cost] => Cost Type 2
        [demand] => 3
        [total] => £10.00
    )
[2] => Array
    (
        [date] => 01/01/21
        [cost] => Cost Type 3
        [demand] => 10
        [total] => £90.00
    )
 )

我的 csv 上传功能是这样的:

  if ($this->request->data['file']['error'] === UPLOAD_ERR_OK){
    $i = 1;
    if (($file = fopen($this->request->data['file']['tmp_name'], "r")) !== FALSE) {
      while (($row = fgetcsv($file, 0, ',', '"')) !== FALSE) {
        if ($i == 1){
          $header = $row;
        }else{
          if (count($header) == count($row)){
            $uploads[] = array_combine($header, $row);
          }else{
            $error_rows[] = $row;
          }
        }
        $i++;
      }
      fclose($file);
    }
  }

【问题讨论】:

  • 这个问题首先需要适当的详细信息。您显示的那个“表格” - 这应该是您的实际 CSV 文件包含的内容吗?那么创建“最终数组”背后的逻辑是什么?这似乎只取了第一个数据行中的值——第二个呢?如果这不重要,请解释为什么不重要。
  • 我的 csv 目前包含上述内容,没有任何费用 - 我想添加费用。所有行都很重要,我仅以数组中的第一个循环为例。每个电子表格的标题会有所不同,因此我在保存数据时会对其进行编码 - 我需要将成本类型和价格与每个需求频率一起保存。

标签: php arrays csv


【解决方案1】:

我想我明白了你的问题,你的意思是说数据不是从第 2 行开始,而是第 2 行包含一条额外的信息,然后数据从第 3 行开始。

在这种情况下,您需要做的就是像解析第一行一样解析第二行,然后在变量中/从变量中存储和使用值。

if ($this->request->data['file']['error'] === UPLOAD_ERR_OK) {
    $i          = 1;
    $finalArray = [];

    if (($file = fopen($this->request->data['file']['tmp_name'], "r")) !== FALSE) {
        while (($row = fgetcsv($file, 0, ',', '"')) !== FALSE) {
            if ($i == 1) {
                $header = $row;
            } elseif ($i == 2) {
                $priceInfo = $row;
            } else {
                if (count($header) == count($row)) {
                    $rowArray = [];
                    for ($i = 1; $i < count($row); $i++) { // Starting from 1 as we need to skip the first column
                        $rowArray[] = [
                            "cost"   => $header[$i],
                            "demand" => $row[$i],
                            "total"  => $priceInfo[$i],
                            "date"  => $row[0],

                        ];
                    }
                    $finalArray[] = $rowArray;
                } else {
                    $error_rows[] = $row;
                }
            }
            $i++;
        }
        fclose($file);
    }
}

【讨论】:

  • 是的,这正是我的意思,谢谢。这个答案非常接近我所需要的 - 我如何在这个数组中保存每一行的日期值?
  • 你想要日期值在哪里?你能用输出数组的样本更新问题吗?
  • 日期将位于包含成本的数组内 - 我已经更新了上面的示例数组
  • 那么你总是可以从$row数组的第一个元素访问日期。更新了答案。
  • 有道理,感谢您的帮助,这对我有用
猜你喜欢
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 2017-08-02
  • 2016-09-01
  • 2020-06-15
  • 1970-01-01
相关资源
最近更新 更多