2

I have two multidimensional arrays which are indexed arrays of associative rows.

$array1 = array(
    array('name' => 'foo', 'id' => 12),
    array('name' => 'bar', 'id' => 34),
    array('name' => 'boo', 'id' => 56),
);

$array2 = array(
    array('name' => 'bar', 'id' => 34),
    array('name' => 'boo', 'id' => 56),
    array('name' => 'bar', 'id' => 78),
);

It is possible that rows might have different id values but the same name value -- such as bar in my sample input data.

I need to compare the arrays based on id values only.

Expected Output: (because ids 34 and 56 are found in $array2)

array(
    array('name' => 'foo', 'id' => 12)
)

I tried $one_not_two = array_diff($array1['id'], $array2['id']); which does not return anything.

I also tried $one_not_two = array_diff($array1['id'], $array2['id']);
which returned an error "argument is not an array."

Originally, I got around it by extracting the ids into a one-dimensional array, then just comparing those. Now a new feature in our application requires me to compare the rows while maintaining the multidimensional structure. Any advice?

Our servers are currently running php 5.3 if that makes any difference.

0

5 Answers 5

4

Because the arrays are multidimensional you have to extract the ids like this:

$ids1 = array();
foreach($array1 as $elem1)
    $ids1[] = $elem1['id'];

$ids2 = array();
foreach($array2 as $elem2)
    $ids2[] = $elem2['id'];

$one_not_two = array_diff($ids1,$ids2);

For your specific question, check out array_diff() with multidimensional arrays

Sign up to request clarification or add additional context in comments.

3 Comments

Thanks but I mentioned in my question that I tried something similar already. That would be an easy solution but something in the rest of the script requires $one_not_two to contain the mapping name => id.
Then you should look at this question: stackoverflow.com/questions/11821680/…
Added your comment to the answer
1

You could use array_udiff to create a custom diff function:

$diff = array_udiff($array1,
                    $array2,
                    function ($a, $b){
                        if($a['id'] == $b['id']){
                            return 0;
                        } else {
                            return ($a['id'] < $b['id'] ? -1 : 1);
                        }
                    }
                );

http://codepad.viper-7.com/2u5EWg

Comments

0

If id is unique you can do that:

$one_not_two = array();

foreach ($array1 as $val) {
    $one_not_two[$val['id']] = $val;
}

foreach ($array1 as $val) {
    if (!isset($one_not_two[$val['id']])) {
        $one_not_two[$val['id']] = $val;
}

Comments

0

In the end I solved it by changing Array1 to an associative array of name => id

Comments

0

Having the same problem as you.

Solved it with: $result = array_diff_assoc($array2, $array1);

Reference: PHP: array_diff_assoc

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.