Php 使用数组_diff_assoc()或获取多维数组的差分

Php 使用数组_diff_assoc()或获取多维数组的差分,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,一段时间以来,我一直在为我认为应该是一个非常容易的问题而挣扎,只是无法找到答案 我有两个数组,这些数组包含关于id、linklabel和url的信息,格式如下: $pageids -------- Array ( [0] => Array ( [id] => 1 [linklabel] => Home [url] => home ) [1] => Array ( [id] => 2 [linklabel] => Graphic

一段时间以来,我一直在为我认为应该是一个非常容易的问题而挣扎,只是无法找到答案

我有两个数组,这些数组包含关于id、linklabel和url的信息,格式如下:

$pageids
--------
Array ( 
[0] => Array 
( [id] => 1 
  [linklabel] => Home 
  [url] => home )

[1] => Array 
( [id] => 2 
  [linklabel] => Graphic Design 
  [url] => graphicdesign ) 

[2] => Array 
( [id] => 3 
  [linklabel] => Other Design 
  [url] => otherdesign ) 

[3] => Array 
( [id] => 6 
  [linklabel] => Logo Design 
  [url] => logodesign ) 

[4] => Array 
( [id] => 15 
  [linklabel] => Content Writing 
  [url] => contentwriting ) 
) 


$parentpage
-----------
Array ( 
[0] => Array 
( [id] => 2 
  [linklabel] => Graphic Design 
  [url] => graphicdesign ) 

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

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


如何让
数组_diff_assoc()
在嵌套数组的键上运行,而不是在第一个数组的键上运行,这样最终的结果就是一个包含
$pageids
中[0]、[3]和[4]数组内容的数组?

要检查多维度,请尝试以下方法:

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

Q.E.D.

要检查多维度,请尝试以下方法:

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

Q.E.D.

来自@Abracadver的非常好的解决方案,但正如我在评论中所述,可能存在关联数组的元素在所有位置的顺序都不相同的情况,因此一个自定义函数将首先按索引/键对它们进行排序非常方便:

function sortAndSerialize($arr){
    ksort($arr);
    return serialize($arr);
}

array_map('unserialize', array_diff(array_map('sortAndSerialize', $pageids), array_map('sortAndSerialize', $parentpage)));

@AbraCadaver的解决方案非常好,但正如我在评论中所述,可能存在关联数组的元素在任何地方的顺序都不相同的情况,因此可以使用一个自定义函数,首先按索引/键对它们进行排序:

function sortAndSerialize($arr){
    ksort($arr);
    return serialize($arr);
}

array_map('unserialize', array_diff(array_map('sortAndSerialize', $pageids), array_map('sortAndSerialize', $parentpage)));
正道

正道


@AbraCadaver给出了极好的回答,@qdev给出了非常有观察力的评论。我的建议只是一个小小的调整,以使@qdev已经提出的答案更具可移植性。将函数赋给变量使其在类方法中也可用,等等

$sortAndSerialize = function ($arr) 
{
    ksort($arr); 
    return serialize($arr);
};

$pageWithNoChildren = array_map(
    'unserialize',
    array_diff(array_map($sortAndSerialize, $pageids),
               array_map($sortAndSerialize, $parentpage))
);

@AbraCadaver给出了极好的回答,@qdev给出了非常有观察力的评论。我的建议只是一个小小的调整,以使@qdev已经提出的答案更具可移植性。将函数赋给变量使其在类方法中也可用,等等

$sortAndSerialize = function ($arr) 
{
    ksort($arr); 
    return serialize($arr);
};

$pageWithNoChildren = array_map(
    'unserialize',
    array_diff(array_map($sortAndSerialize, $pageids),
               array_map($sortAndSerialize, $parentpage))
);

太棒了!谢谢你!顺便说一句,我想你不能很快解释一下,可以吗?我以前没有使用过非序列化或数组_映射,现在正在查找它们,但如果您能快速运行,那将是惊人的,无论是哪种方式,再次感谢!!我想我可能已经找到了答案,所以对于阅读本文的其他人和好奇的人来说,我相信serialize()会将php键和值转换为字符串,因此在所有$pageId数组中都有一个字符串,在所有$parentpages数组中都有一个字符串。然后,array_diff函数可以比较这些字符串,找出$pageid中的字符串和$parentpages中的字符串,然后使用unserialize()将结果转换回php值。正是我需要的!再次感谢!:)谢谢我刚刚一步一步地阅读了你的文章,还找到了一些文档,你说的内容与我从阅读中所了解的内容基本相同,所以看起来我明白了:)再次感谢,这太棒了!回答很好,但这假设关联数组的排序都相同(关联键的顺序相同),否则这将无法按预期工作…此方法对我帮助很大,但在我的情况下,当数组序列化时,我必须考虑数组中每个元素的数据类型,我的id在一个数组中是int,在另一个数组中是string,所以没有找到匹配项。这太棒了!谢谢你!顺便说一句,我想你不能很快解释一下,可以吗?我以前没有使用过非序列化或数组_映射,现在正在查找它们,但如果您能快速运行,那将是惊人的,无论是哪种方式,再次感谢!!我想我可能已经找到了答案,所以对于阅读本文的其他人和好奇的人来说,我相信serialize()会将php键和值转换为字符串,因此在所有$pageId数组中都有一个字符串,在所有$parentpages数组中都有一个字符串。然后,array_diff函数可以比较这些字符串,找出$pageid中的字符串和$parentpages中的字符串,然后使用unserialize()将结果转换回php值。正是我需要的!再次感谢!:)谢谢我刚刚一步一步地阅读了你的文章,还找到了一些文档和你所说的