#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-wherenotin2. используйте
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