Получить разницу между двумя коллекциями с разными ключами

#php #laravel

#php #laravel

Вопрос:

У меня есть две коллекции для сравнения:

 $collection1 = collect([
    'alex',
    'john'
]);
  
 $collection2 = collect([
    [
        'id' => 1,
        'name' => 'alex',
    ],
    [
        'id' => 2,
        'name' => 'john',
    ],
    [
        'id' => 3,
        'name' => 'joe',
    ],
]);
  

Я хочу сравнить collection2 $collection1 и получить только те элементы, name значение которых отсутствует в другой коллекции, результат, который я хочу:

 [
    'id' => 3,
    'name' => 'joe',
]
  

Но проблема в том, что первая коллекция имеет плоский массив, поэтому я сделал это:

 $collection2->diffUsing($collection1, function ($a, $b){
    return strcmp($a['name'], $b);
});
  

Но я получаю сообщение об ошибке :

Исключение ErrorException : strcmp() ожидает, что параметр 2 будет строкой, заданный массив

Комментарии:

1. вы уже пробовали whereNotIn ? laravel.com/docs/8.x/collections#method-wherenotin

2. используйте array_diff функцию..

3. Выполнение $arr = array_column($array2, 'name') создаст массив только из имен из 2-го массива, после чего вы сможете просто сравнить их напрямую

4.используйте вот так .. array_diff($array1, $array2) link..

5. @lagbox спасибо, чувак, это сработало, не стесняйтесь добавлять ответ.

Ответ №1:

Вы можете использовать whereNotIn для этого, передавая первую коллекцию в качестве значений, которые вы хотите отфильтровать:

 $result = $collect2->whereNotIn('name', $collect1);
  

Документы Laravel 8.x — Коллекции — Доступные методы — whereNotIn