PHP比较由CSV制作的多维数组中的键/值

问题描述 投票:0回答:4

我有两(2)个.csv文件:

CompanySubset.csv

| id | company   | description               |
|----|-----------|---------------------------|
| 1  | Apple     | Description for Apple     |
| 2  | Microsoft | Description for Microsoft |
| 3  | IBM       | Description for IBM       |


ContactSubset.csv
| id | name  | address           | phone       |
|----|-------|-------------------|-------------|
| 1  | Bob   | 1234 Address Lane | 1+234567890 |
| 2  | Sally | 4321 Address Lane | 1+987654321 |
| 3  | Cam   | 2468 Address Lane | 1+468135901 |

使用php,我需要读取每个文件并比较id列以获得两者之间的匹配(2)。如果我在两个(2)之间找到匹配的id,那么我需要将该特定行合并在一起。

例如:CompanySubset id 1匹配ContactSubset id 1.因此,在idContactSubset为1的行将与CompanySubset上的第1行合并。然后将形成以下内容:

| id | company | description           | name | address           | phone       |
|----|---------|-----------------------|------|-------------------|-------------|
| 1  | Apple   | Description for Apple | Bob  | 1234 Address Lane | 1+234567890 |

我已经能够将每个.csv变成一个数组(见下文),但那就是它。

$filename = 'CompanySubset.csv';

$company_array = [];

if (($handle = fopen("{$filename}", "r")) !== FALSE) {

    while (($companyData = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $company_array[] = $companyData;
    }

    fclose($handle);
}
php arrays csv multidimensional-array
4个回答
1
投票

您需要使用id元素作为数组的键。然后您可以合并相关的行。

$filename = 'CompanySubset.csv';

$company_array = [];

if ($handle = fopen($filename, "r")) {
    while ($companyData = fgetcsv($handle, 1000, ",")) {
        $company_array[$companyData[0]] = array_slice($companyData, 1);
    }
    fclose($handle);
}

$filename = 'ContactSubset.csv';

$contact_array = [];

if ($handle = fopen($filename, "r")) {
    while ($contactData = fgetcsv($handle, 1000, ",")) {
        $contact_array[$companyData[0]] = array_slice($contactData, 1);
    }
    fclose($handle);
}

有关使用相同键合并数组元素的方法,请参阅Merging two PHP arrays with same numeric key

也没有必要所有那些!== FALSE测试,只需使用赋值的值作为条件表达式(有几次需要时,例如测试array_search()的结果,因为0是假的,但你的任何用途都不需要它)。


0
投票

以下功能已被使用:

array_walk() - 将用户提供的函数应用于数组的每个成员

array_merge - 合并一个或多个数组

解:

$companySubset = [
  1 => ['Apple','Description for Apple'],
  2 => ['Microsoft','Description for Microsoft'],
  3 => ['IBM','Description for IBM']
];

$contactSubset = [
 1 => ['Bob','1234 Address Lane','1+234567890 '],
 2 => ['Sally','4321 Address Lane','1+987654321'],
 3 => ['Cam','2468 Address Lane','1+468135901']
];
$res =[];
array_walk($companySubset, function($v,$k) use ($contactSubset, &$res){
  $res[] = array_key_exists($k, $contactSubset) ? array_merge($v,$contactSubset[$k]) : $v;
});

0
投票
  1. 创建两个二维数组,其中id为csv的密钥。
  2. 使用https://www.php.net/manual/ru/function.array-intersect-key.php获取两者之间相交的id集。
  3. 如果存在,则迭代步骤2中的一组id,并比较实际值。

0
投票

这通过首先读取ContactSubset.csv并创建由第一个字段索引的数组(使用array_shift()将其从结果中删除)来解决它。

然后第二个循环几乎与您的代码相同,但是当它读取每一行时,它会检查联系人详细信息并使用array_merge()添加额外的详细信息......

$filename = 'ContactSubset.csv';
$contact_array = [];

if (($handle = fopen($filename, "r")) !== FALSE) {
    while (($contactData = fgetcsv($handle)) !== FALSE) {
        $id = array_shift($contactData);
        $contact_array[$id] = $contactData;
    }
    fclose($handle);
}

$filename = 'CompanySubset.csv';
$company_array = [];

if (($handle = fopen($filename, "r")) !== FALSE) {
    while (($companyData = fgetcsv($handle)) !== FALSE) {
        if ( isset($contact_array[$companyData[0]]) )   {
            $companyData = array_merge($companyData, $contact_array[$companyData[0]]);
        }
        $company_array[] = $companyData;
    }

    fclose($handle);
}
print_r($company_array);