比较包含数据行的 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 的代码片段适用于这种情况,但如果目标柱状值在各自的数组中不是唯一的,它会由于键冲突而破坏数据。这只是对未来研究人员的警告。