PHP Найти одинаковые значения в двух многомерных массивах и отобразить их в отдельный массив - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть два многомерных массива:

Array (
[1] => Array
    (   
    [id] => 1 
    [email] => aaa@mail.com

    some irrelevant pairs
    )

[2] => Array
    (
    [id] => 2 
    [email] => bbb@mail.com

    some irrelevant pairs
    )

[3] => Array
    (
    [id] => 3 
    [email] => ccc@mail.com

    some irrelevant pairs
    ))

Array (
[1] => Array
    (   
    [id] => 4 
    [email] => aaa@mail.com

    some irrelevant pairs
    )

[2] => Array
    (
    [id] => 5 
    [email] => bbb@mail.com

    some irrelevant pairs
    )

[3] => Array
    (
    [id] => 6 
    [email] => ccc@mail.com

    some irrelevant pairs
    ))

Как вы видите, они оба имеют ключ 'email' с одинаковыми значениями. Как извлечь пары идентификаторов в виде пар ключ-значение в отдельный массив в виде карты тех же электронных писем? Я пытался использовать циклы foreach и функцию in_array, но что-то не так. Вот что мне нужно:

Result (pairs of IDs where e-mail values are the same: my_array_with_pairs_of_IDs = ( "1" => "4", "2" => "5", "3" => "6" );

Пожалуйста, помогите, большое спасибо!

Ответы [ 3 ]

0 голосов
/ 04 ноября 2018

Вы можете использовать array_column для создания двух плоских массивов, в которых вы можете использовать array_search.
Если array_search возвращает не false, это ключ найденного совпадения.

$arr1 = array_column($arr1, 'email', 'id');
$arr2 = array_column($arr2, 'email', 'id');

foreach($arr1 as $key => $val){
    $find = array_search($val, $arr2);
    if($find !==false) $result[$key] = $find;
}
var_dump($result);

Выход:

array(3) {
  ["1 "]=>
  string(2) "4 "
  ["2 "]=>
  string(2) "5 "
  ["3 "]=>
  string(2) "6 "
}

https://3v4l.org/6XhUd

0 голосов
/ 04 ноября 2018

Производительность оптимизирована, на основе ответа @Andreas:

$map1 = array_column($arr1, 'id', 'email');
$map2 = array_column($arr2, 'id', 'email');

$result = [];

foreach ($map1 as $email => $id)
{
    if (isset($map2[$email]))
    {
        $result[$id] = $map2[$email];
    }
}
  • удалено $arr1 и $arr2 переопределено;
  • добавлено $result объявление.
0 голосов
/ 04 ноября 2018

Вы можете использовать этот метод и хранить данные в новом массиве

$result = [];
foreach($a1 as $a){
   foreach($b1 as $b){
      if($b[email] == $a[email])
         $result[] = [$a[id]=>$b[id]];
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...