Smokescreen Smokescreen - 4 months ago 12
PHP Question

Use array_diff_assoc() or get difference of multidimensional arrays

I've been struggling with what I think should be a really easy issue for sometime now and just can't work out the answer.

I have two arrays and these arrays contain information about id, linklabel and url in the following format:

$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 ) )


I'm now trying to compare these two in order to find the information that is in
$pageids
but NOT in
$parentpage
- this will then make up another array called
$pageWithNoChildren
. However when I use the following code:

$pageWithNoChildren = array_diff_assoc($pageids,$parentpage);


The
array_diff_assoc()
runs on the first level of the arrays and therefore sees that both
$pageids
and
$parentpages
have a [0] and [1] key so it ignores them and returns all the information from
$pageids
from [2] onwards. However I want it to look at the content of the nested arrays and compare those e.g. I need it to see which id, linklabel and url are in
$pageids
and not in
$parentpages
and return those values.

How can I get the
array_diff_assoc()
to run on the keys of the nested arrays and not the keys of the first arrays so the final result is an array that contains the contents of the [0], [3] and [4] arrays from
$pageids
?

Answer

To check multi-deminsions try something like this:

$pageWithNoChildren = array_map('unserialize',
    array_diff(array_map('serialize', $pageids), array_map('serialize', $parentpage)));
  • array_map() runs each sub-array of the main arrays through serialize()
  • serialize() converts each sub-array into a string representation of that sub-array
  • the main arrays now have values that are not arrays but string representations of the sub-arrays
  • array_diff() now has a one-dimensional array for each of the arrays to compare
  • after the difference is returned array_map() runs the array result (differences) through unserialize() to turn the string representations back into sub-arrays

Q.E.D.