获取两个二维数组的关联行之间的差异

我有两个数组,这些数组包含有关idlinklabelurl的信息,格式如下:

$pageids = [
    ['id' => 1, 'linklabel' => 'Home', 'url' => 'home'],
    ['id' => 2, 'linklabel' => 'Graphic Design', 'url' => 'graphicdesign'],
    ['id' => 3, 'linklabel' => 'Other Design', 'url' => 'otherdesign'],
    ['id' => 6, 'linklabel' => 'Logo Design', 'url' => 'logodesign'],
    ['id' => 15, 'linklabel' => 'Content Writing', 'url' => 'contentwriting'],
];

$parentpage = [
    ['id' => 2, 'linklabel' => 'Graphic Design', 'url' => 'graphicdesign'],
    ['id' => 3, 'linklabel' => 'Other Design', 'url' => 'otherdesign'],
];
我现在正在尝试比较这两个数组,以便找到$pageids中而不是$parentpage中的信息-这将组成另一个名为$pageWithNoChildren的数组。但是,当我使用以下代码时:

$pageWithNoChildren = array_diff_assoc($pageids,$parentpage);
array_diff_assoc()在第一级数组上运行,因此看到$pageids$parentpages都有[0]和[1]键,因此它会忽略它们,并返回从[2]开始的所有信息。但是,我希望它查看嵌套数组的内容并比较这些内容,例如,我需要它来查看哪些idlinklabelurl$pageids中,而不在$parentpages中,然后返回这些值。

如何才能使array_diff_assoc()在嵌套数组的键上运行,而不是在第一个数组的键上运行,以便最终结果是一个包含$pageids中的[0]、[3]和[4]数组内容的数组?

预期结果:

array (
  0 => 
  array (
    'id' => 1,
    'linklabel' => 'Home',
    'url' => 'home',
  ),
  3 => 
  array (
    'id' => 6,
    'linklabel' => 'Logo Design',
    'url' => 'logodesign',
  ),
  4 => 
  array (
    'id' => 15,
    'linklabel' => 'Content Writing',
    'url' => 'contentwriting',
  ),
)

解决方案

要检查多维,请尝试执行以下操作:

$pageWithNoChildren = array_map('unserialize',
    array_diff(array_map('serialize', $pageids), array_map('serialize', $parentpage)));
  • array_map()通过serialize()运行主数组的每个子数组,从而将每个子数组转换为该子数组的字符串表示形式
    • 主数组现在的值不是数组,而是子数组的字符串表示
  • array_diff()现在每个要比较的数组都有一个一维数组
  • 返回差异后array_map()运行数组结果(差异)至unserialize()将字符串表示形式转换回子数组

Q.E.D.

相关文章