【问题标题】:Cross compare two sets of data交叉比较两组数据
【发布时间】:2020-10-26 12:15:11
【问题描述】:

我有一个报告表。一份报告可以有许多文档(它们是 csv 文件路径)。一个文档有很多映射。

所以我最初循环我的文档以获取报告并使用 ParseCsv 加载 csv 数据

foreach ($this->report->uploadedDocuments->documents as $document) {
    $csv = new ParseCsv\Csv();
    $csv->limit = 1;
    $csv->parse(storage_path("app/" . $document->fullName));
    $this->csvData = $csv->data;
}

如果我输出这个,我会为每个文档看到类似以下内容(此处仅显示一个文档中的一个 CSV 行)

[
   {
      "id":"1",
      "field1":"Some data",
      "something":"Some data",
      "something":"Some data",
      "something":"Some data",
      "something":"Some data",
   }
]

现在每个文档都有映射,所以我也可以这样做

foreach ($this->report->uploadedDocuments->documents as $document) {
    
    //Load CSV data
    
    foreach ($document->mappings as $column) {
        Log::debug(json_encode($column));
    }
}

上面的输出是这样的

{
   "document_id":"6434fc74-18f7-43ff-be33-3a8b0cf1cadc",
   "field1":1,
   "field2":null,
   "field3":null,
   "created_at":"2020-10-26T10:19:36.000000Z",
   "updated_at":"2020-10-26T10:19:36.000000Z"
}

所以从上面我可以看到 field1 位于 csv 数据的第 1 列(索引)中。我还可以看到这个 CSV 没有 field2 或 field3。所以我的想法是把原来的CSV数据变成这个

[
   {
      "field1":"Some data",
   }
]

这就是我的想法。我首先需要循环报告文档,加载 CSV 文件并读取数据

foreach ($this->analysis->uploadedDocuments->documents as $document) {
    $csv = new ParseCsv\Csv();
    $csv->limit = 5;
    $csv->parse(storage_path("app/" . $document->fullName));

    if (empty($csv->data)) {
        throw new Exception('Not data found in file.');
    }

    foreach ($csv->data as $dataKey => &$item) {
        foreach ($item as $key => $value) {
            //Now I have access to the keys and values from csv
        }
    }
}

但是,我该如何对照我的文档映射进行交叉检查呢?我显然必须循环映射,但我应该在哪里做呢?我有一些我认为可以工作的东西,但它非常混乱,并且依赖于我知道列名,例如

foreach ($this->report->uploadedDocuments->documents as $document) {
    $csv = new ParseCsv\Csv();
    $csv->limit = 5;
    $csv->parse(storage_path("app/" . $document->fullName));

    if (empty($csv->data)) {
        throw new Exception('Not data found in file.');
    }
    
    foreach ($document->mappings as $column) {
        foreach ($csv->data as $dataKey => &$item) {
            foreach ($item as $key => $value) {
                //match the mapping column to the csv column
                if ($column->fieldOne !== NULL && $key === $column->fieldOne) {
                    //now I have access to the values for that column
                }
            }
        }
    }
}

会有更好的方法来实现这样的目标吗?

谢谢

【问题讨论】:

    标签: php arrays laravel csv


    【解决方案1】:

    根据您的问题,我提出以下建议

    <?PHP
     $csvData = $csv->data;
     $csvData = json_encode($csvData);
     $arr = json_decode($csvData, true);
     $field1 = array_column($arr, "field1");
     print_r($field1);
    ?>
    

    这一行将对象转换为json字符串 $csvData = json_encode($csvData);

    这一行将json字符串转换为纯数组 $arr = json_decode($csvData, true);

    这一行从多维数组中提取列值 $field1 = array_column($arr, "field1");

    我希望这会奏效。

    【讨论】:

    • 做了一些细微的调整,但它帮助我完成了我需要实现的目标,谢谢
    • 谢谢,很高兴听到这个消息。
    猜你喜欢
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2010-09-09
    • 2012-12-06
    相关资源
    最近更新 更多