Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 打开两个CSV文件,比较并将其添加到阵列中_Php_Arrays_Csv - Fatal编程技术网

Php 打开两个CSV文件,比较并将其添加到阵列中

Php 打开两个CSV文件,比较并将其添加到阵列中,php,arrays,csv,Php,Arrays,Csv,我试图从两个不同的CSV文件中获取信息,并将它们添加到一个数组中。我基本上是打开第一个文件,将其内容作为字符串放入数组中。接下来是棘手的部分。这两个文件都有一个共同的ID字段,因此只要ID匹配,就必须将其放入数组中 我尝试了两种不同的方法,打开一个文件,在这个文件中打开另一个,比较并保存到数组。另一种方法是将两个文件中的所有信息发送到两个分离数组,然后找到匹配项并将它们发送到第三个数组 代码如下: $handle0 = \fopen("/Data/mountain1.csv", "r"); i

我试图从两个不同的CSV文件中获取信息,并将它们添加到一个数组中。我基本上是打开第一个文件,将其内容作为字符串放入数组中。接下来是棘手的部分。这两个文件都有一个共同的ID字段,因此只要ID匹配,就必须将其放入数组中

我尝试了两种不同的方法,打开一个文件,在这个文件中打开另一个,比较并保存到数组。另一种方法是将两个文件中的所有信息发送到两个分离数组,然后找到匹配项并将它们发送到第三个数组

代码如下:

$handle0 = \fopen("/Data/mountain1.csv", "r");

if ($handle0) {
    $line0 = 0;
    while (($buffer0 = fgets($handle0, 4000)) !== false) {
        if ($line0 > 0){
            $mountainArray = str_getcsv($buffer0, ",");                 
            $obj = array();
            $obj["id"] = $mountainArray[2];
            $obj["name"] = $mountainArray[0];
            $obj["country"] = $mountainArray[1];

            $handle1 = fopen("/Data/mountain1.csv", "r");
            if ($handle1) {
                $line1 = 0;
                while (($buffer1 = fgets($handle1, 4000)) !== false) {
                    if ($line1 > 0) {
                        $latlonArray = str_getcsv($buffer1, ",");
                        $content = array();
                        $content["id"] = $latlonArray[1];
                        if ((int)$content["id"] == (int)$obj["id"]) {
                            $obj["latitude"] = $latlonArray[7];
                            $obj["longitude"] = $latlonArray[8];
                        }
                    $line1++;
                    }
                }
                fclose($handle1);
            }

            $mountain[] = $obj;
        }
        $line0++;
    }
    fclose($handle0);
}
这段代码只是循环,什么也不做

if ($handle0) {
    while (($buffer0 = fgets($handle0, 4000)) !== false) {
        $mountainArray = str_getcsv($buffer0, ",");
        $content0 = array();
        $content0["id"] = $mountainArray[2];
        $content0["name"] = $mountainArray[0];
        $content0["country"] = $mountainArray[1];

        $mountain[] = $content0;
    }
    fclose($handle0);
}

if ($handle1) {
    while (($buffer1 = fgets($handle1, 4000)) !== false) {
        $latlonArray = str_getcsv($handle1, ",");
        $content1 = array();
        $content1["id"] = $latlonArray[1];
        $content1["latitude"] = $latlonArray[7];
        $content1["longitude"] = $latlonArray[8];

        $latlon[] = $content1;
    }
    fclose($handle1);
}

foreach ($mountain as $row0) {
    $obj = array();
    $obj["id"] = $row0["productUid"];
    $obj["name"] = $row0["name"];
    $obj["country"] = $row0["address"];

    foreach ($latlon as $row1) {
        if((int)$row1["id"] == (int)$row0["id"]) {
            $obj["latitude"] = $row1["latitude"];
            $obj["longitude"] = $row1["longitude"];
        }
    }

    $mountains[] = $obj;
}

如果我理解正确的话,这个文件只会返回null…

如果我理解正确的话,那么您正试图根据两个csv文件的id获取它们之间的交集

您将要做的是尽可能减少遇到内存问题的机会

在要比较的文件中获取并构建一个
id
s数组。一个简单的
fopen
然后在循环中调用
fgetcsv
应该可以工作

$ids = array();
$fp = fopen($file1, "r");
while ($row = fgetcsv($fp)){
    // assuming first field contains the id
    $ids[$row[0]] = "";
} 
fclose($fp);
打开要比较的文件,并执行相同的fopen、fgetcsv循环,但检查在步骤1中构建的列表中是否存在每个id。然后,如果它在列表中,则将其添加到结果中

$results = array();
$fp = fopen($file2, "r");
while ($row = fgetcsv($fp)){
    if (isset($ids[$row[0])){
          $results[] = $row;
    }
}

这种方法避免了将两个文件中的所有数据都表示为一个数组。

这可能有点超出需要,但对我来说是可行的

csv1.csv

id,val
0,cat
1,dog
id,val
2,brid
1,cat
csv2.csv

id,val
0,cat
1,dog
id,val
2,brid
1,cat
PHP

<?php
header("content-type: text/plain");
$array = [];
$i = 0;
$csv1 = "csv1.csv";
$csv2 = "csv2.csv";

// Load file 1 into an array
// Skip row 1
if (($handle = fopen($csv1, "r")) !== FALSE){
    while (($data = fgetcsv($handle)) !== FALSE){
        if($i == 0){$i++; continue;}
        $array[] = $data;
        $i++;
    }
    fclose($handle);
}

$i = 0;
// Load file 2 into the array if the values don't exist
// Skip row 1
if (($handle = fopen($csv2, "r")) !== FALSE){
    while (($data = fgetcsv($handle)) !== FALSE){
        if($i == 0){$i++; continue;}
        $inarray = false;
        foreach($array as $itm){
            if(in_array($data[0], $itm)){
                $inarray = true;
                break;
            }
        }
        if(!$inarray){
            $array[] = $data;
        }
        $i++;
    }
    fclose($handle);
}


print_r($array);

根据您的代码,我假设:

  • 对于包含山脉数据的CSV文件:id位于位置2,名称位于0,国家位于1
  • 对于具有以下坐标的CSV文件:id为1,纬度为7,经度为8
我决定为您提供一个更全面的代码片段,它适用于任何数量的CSV文件,您只需将它们添加到
$csvFiles
数组中,并使用文件名作为键,文件类型作为值

<?php
$result   = array();
$csvFiles = array(
    'mountains.csv'   => 'Mountain',
    'coordinates.csv' => 'Coordinate'
);

foreach ($csvFiles as $csvFile => $type) {
    if ($handle = fopen($csvFile, 'r')) {
        $lineNumber = 0;

        while ($data = fgetcsv($handle, 128, ',')) {
            if (!$lineNumber) {
                $lineNumber++;
                continue;
            }

            switch ($type) {
                // Store the record in the result array
                case 'Mountain':
                    $record = array(
                        'id'      => $data[2],
                        'name'    => $data[0],
                        'country' => $data[1]
                    );

                    $id          = $record['id'];
                    $result[$id] = $record;
                    break;

                // Add longitude and latitude to the record
                // if already in the result array
                case 'Coordinate':
                    $record = array(
                        'id'        => $data[1],
                        'latitude'  => $data[7],
                        'longitude' => $data[8]
                    );

                    $id = $record['id'];
                    if (!empty($result[$id])) {
                        $result[$id] = array_merge($result[$id], $record);
                    }
                    break;
            }
        }
    }
}

print_r($result);
坐标.csv 输出将是:

Array
(
    [ 1] => Array
        (
            [id] =>  1
            [name] => aaa
            [country] =>  USA
            [latitude] =>  10.00
            [longitude] =>  20.00
        )

    [ 2] => Array
        (
            [id] =>  2
            [name] => aab
            [country] =>  Canada
            [latitude] =>  1.00
            [longitude] =>  2.00
        )

    [ 3] => Array
        (
            [id] =>  3
            [name] => aac
            [country] =>  USA
            [latitude] =>  2.00
            [longitude] =>  4.00
        )

    [ 4] => Array
        (
            [id] =>  4
            [name] => bbb
            [country] =>  Portugal
            [latitude] =>  5.00
            [longitude] =>  10.00
        )

    [ 5] => Array
        (
            [id] =>  5
            [name] => ccc
            [country] =>  Germany
            [latitude] =>  100.00
            [longitude] =>  200.00
        )
)

你想把这两个文件做成一个数组吗?是的,这样我就可以把我需要的数据存储在一个地方,以后再使用它,比如在mysql语句中使用它们,或者创建另一个csv。谢谢!它确实帮助了我,但我也在想,没有函数怎么办?我已经更新了答案,并将代码从函数移到了相应的
案例中。我无法验证此代码重构,但我认为它可以正常工作。非常感谢!无论有无功能,这两种代码都像一个符咒