PHP比较由CSV制作的多维数组中的键/值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP比较由CSV制作的多维数组中的键/值相关的知识,希望对你有一定的参考价值。
我有两(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.因此,在id
上ContactSubset
为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);
}
这通过首先读取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);
您需要使用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
是假的,但你的任何用途都不需要它)。
以下功能已被使用:
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;
});
- 创建两个二维数组,其中id为csv的密钥。
- 使用https://www.php.net/manual/ru/function.array-intersect-key.php获取两者之间相交的id集。
- 如果存在,则迭代步骤2中的一组id,并比较实际值。
以上是关于PHP比较由CSV制作的多维数组中的键/值的主要内容,如果未能解决你的问题,请参考以下文章
PHP:如何将一个数组中的键与另一个数组中的值进行比较,并返回匹配项?
使用带有 sql 的键值对搜索 php 多维关联数组,例如 '%LIKE%' 构造