B Developer2
B Developer2

Reputation: 49

Isolate differing rows between two 2d arrays with different identifying keys

Array one:

$arr1 = array(
    array("uid" => "cgajate"),
    array("uid" => "frankfurt9"),
    array("uid" => "ricoetc")
);

Array two:

$arr2 = array(
    array("uxid" => "cgajate"),
    array("uxid" => "ricoetc"),
    array("uxid" => "ricoetc1"),
    array("uxid" => "frankfurt9"),
    array("uxid" => "panterafan")
);

I have two multidimensional array (that as you can see above, do not share the same key name for the id, uxid vs uid). I am trying to find unmatched array on basis of comparing 'uid' and 'uxid' values and my expected result is:

Array
(
    [0] => Array
        (
            [uxid] => ricoetc1
        )
    [1] => Array
        (
            [uxid] => panterafan
        )
)
    

Below is my code,I am trying to find matched value and remove from result array but when I am printing give me empty array.

  $tmpArray = array();
   foreach($arr1 as $data1) {
    $duplicate = false;
     foreach($arr2 as $data2) {
        if($data1['uid'] === $data2['uxid']) $duplicate = true;
      }
     if($duplicate === false) $tmpArray[] = $data1;
   }
   echo "<pre>", print_r($tmpArray);

Upvotes: 0

Views: 513

Answers (2)

mickmackusa
mickmackusa

Reputation: 47992

Most elegantly, inverse the functional effect of this answer of mine.

Code: (Demo)

var_export(
    array_udiff(
        $arr2,
        $arr1,
        fn($a, $b) => ($a['uid'] ?? $a['uxid']) <=> ($b['uid'] ?? $b['uxid'])
    )
);

Since the $a and $b variables may relate to either/any of the input arrays, you must try to access one of the array's keys, then fallback to the other array's keys.

Output:

array (
  2 => 
  array (
    'uxid' => 'ricoetc1',
  ),
  4 => 
  array (
    'uxid' => 'panterafan',
  ),
)

To re-index the output, just call array_values() on array_udiff()'s output ... if truly needed.

Upvotes: 1

Arun Kumaresh
Arun Kumaresh

Reputation: 6311

try this

 $arr1 = array(
        array("uid" => "cgajate"),
        array("uid" => "frankfurt9"),
        array("uid" => "ricoetc")
        );

         $arr2 = array(
        array("uxid" => "cgajate"),
        array("uxid" => "ricoetc"),
        array("uxid" => "ricoetc1"),
        array("uxid" => "frankfurt9"),
        array("uxid" => "panterafan")
        );

foreach($arr2 as $k => $v){

if (!in_array($v['uxid'], array_column($arr1, 'uid'))){

    $new[] =$v;     
}

}

print_r($new);

Upvotes: 3

Related Questions