比较包含数据行的 2 个数组并显示匹配的记录
Compare 2 arrays containing rows of data and displays the matched records
我想找出一种方法来匹配两个数组上的 'userid'。然后匹配的那些,保留在 MongoDBResults 中的行。
$mysql = [
['id' => 1, 'userid' => 655342],
['id' => 3, 'userid' => 777777],
['id' => 6, 'userid' => 454777],
];
$mongo = [
['id' => 1, 'userid' => 655342, 'addr1' => '123 Test Ave', 'addr2' => 'MyCityState', 'zipcd' => '99955', 'items' => 888888],
['id' => 2, 'userid' => 989855, 'addr1' => '124 Test Ave', 'addr2' => 'MyCityState', 'zipcd' => '66955', 'items' => 887788],
['id' => 3, 'userid' => 777777, 'addr1' => '125 Test Ave', 'addr2' => 'MyCityState', 'zipcd' => '11955', 'items' => 886688],
['id' => 4, 'userid' => 666666, 'addr1' => '126 Test Ave', 'addr2' => 'MyCityState', 'zipcd' => '39954', 'items' => 885588],
];
期望的输出:
array (
0 =>
array (
'id' => 1,
'userid' => 655342,
'addr1' => '123 Test Ave',
'addr2' => 'MyCityState',
'zipcd' => '99955',
'items' => 888888,
),
2 =>
array (
'id' => 3,
'userid' => 777777,
'addr1' => '125 Test Ave',
'addr2' => 'MyCityState',
'zipcd' => '11955',
'items' => 886688,
),
)
我试过了:
$results = array_intersect($mysql, $mongo);
还有
$result = array_diff($mysql, $mongo);
尝试array_uintersect
$intersection = array_uintersect($mysqlResult, $mongoResult, function ($mysqlRow, $mongoRow) {
return $mysqlRow['userId'] === $mongoRow['userId'];
});
您可以在 userid
上建立索引,然后计算键的交集:
$results = array_intersect_key(array_column($MongoDBResults, null, 'userid'),
array_column($MySqlResults, null, 'userid'));
array_uintersect()
是最适合此任务的本机函数。您想要比较两个数组中所有行中的特定列值。 array_uintersect()
的回调参数需要返回一个整数值。
从回调中返回一个布尔值(如@IliaYatsenko 所示)将被转换为一个整数,但这不提供 -1
值的可能性。
实施 three-way 比较(使用宇宙飞船运算符 <=>
完成)将使内部排序以最佳效率执行。
代码:(Demo)
var_export(
array_uintersect(
$mongo,
$mysql,
fn($a, $b) => $a['userid'] <=> $b['userid']
)
);
输出:
array (
0 =>
array (
'id' => 1,
'userid' => 655342,
'addr1' => '123 Test Ave',
'addr2' => 'MyCityState',
'zipcd' => '99955',
'items' => 888888,
),
2 =>
array (
'id' => 3,
'userid' => 777777,
'addr1' => '125 Test Ave',
'addr2' => 'MyCityState',
'zipcd' => '11955',
'items' => 886688,
),
)
虽然@AbraCadaver 的代码片段适用于这种情况,但如果目标柱状值在各自的数组中不是唯一的,它会由于键冲突而破坏数据。这只是对未来研究人员的警告。
我想找出一种方法来匹配两个数组上的 'userid'。然后匹配的那些,保留在 MongoDBResults 中的行。
$mysql = [
['id' => 1, 'userid' => 655342],
['id' => 3, 'userid' => 777777],
['id' => 6, 'userid' => 454777],
];
$mongo = [
['id' => 1, 'userid' => 655342, 'addr1' => '123 Test Ave', 'addr2' => 'MyCityState', 'zipcd' => '99955', 'items' => 888888],
['id' => 2, 'userid' => 989855, 'addr1' => '124 Test Ave', 'addr2' => 'MyCityState', 'zipcd' => '66955', 'items' => 887788],
['id' => 3, 'userid' => 777777, 'addr1' => '125 Test Ave', 'addr2' => 'MyCityState', 'zipcd' => '11955', 'items' => 886688],
['id' => 4, 'userid' => 666666, 'addr1' => '126 Test Ave', 'addr2' => 'MyCityState', 'zipcd' => '39954', 'items' => 885588],
];
期望的输出:
array (
0 =>
array (
'id' => 1,
'userid' => 655342,
'addr1' => '123 Test Ave',
'addr2' => 'MyCityState',
'zipcd' => '99955',
'items' => 888888,
),
2 =>
array (
'id' => 3,
'userid' => 777777,
'addr1' => '125 Test Ave',
'addr2' => 'MyCityState',
'zipcd' => '11955',
'items' => 886688,
),
)
我试过了:
$results = array_intersect($mysql, $mongo);
还有
$result = array_diff($mysql, $mongo);
尝试array_uintersect
$intersection = array_uintersect($mysqlResult, $mongoResult, function ($mysqlRow, $mongoRow) {
return $mysqlRow['userId'] === $mongoRow['userId'];
});
您可以在 userid
上建立索引,然后计算键的交集:
$results = array_intersect_key(array_column($MongoDBResults, null, 'userid'),
array_column($MySqlResults, null, 'userid'));
array_uintersect()
是最适合此任务的本机函数。您想要比较两个数组中所有行中的特定列值。 array_uintersect()
的回调参数需要返回一个整数值。
从回调中返回一个布尔值(如@IliaYatsenko 所示)将被转换为一个整数,但这不提供 -1
值的可能性。
实施 three-way 比较(使用宇宙飞船运算符 <=>
完成)将使内部排序以最佳效率执行。
代码:(Demo)
var_export(
array_uintersect(
$mongo,
$mysql,
fn($a, $b) => $a['userid'] <=> $b['userid']
)
);
输出:
array (
0 =>
array (
'id' => 1,
'userid' => 655342,
'addr1' => '123 Test Ave',
'addr2' => 'MyCityState',
'zipcd' => '99955',
'items' => 888888,
),
2 =>
array (
'id' => 3,
'userid' => 777777,
'addr1' => '125 Test Ave',
'addr2' => 'MyCityState',
'zipcd' => '11955',
'items' => 886688,
),
)
虽然@AbraCadaver 的代码片段适用于这种情况,但如果目标柱状值在各自的数组中不是唯一的,它会由于键冲突而破坏数据。这只是对未来研究人员的警告。