Php 使用数组_diff_assoc()或获取多维数组的差分
一段时间以来,我一直在为我认为应该是一个非常容易的问题而挣扎,只是无法找到答案 我有两个数组,这些数组包含关于id、linklabel和url的信息,格式如下: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
$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值。正是我需要的!再次感谢!:)谢谢我刚刚一步一步地阅读了你的文章,还找到了一些文档和你所说的