Laravel
February 20

Поиск дубликатов в коллекциях Laravel

Нужно найти дубликаты в коллекции? Метод `duplicates` в Laravel предоставляет простой способ найти повторяющиеся значения, будь то простые типы или вложенные атрибуты.

Базовое использование

Поиск дубликатов с помощью обычной и строгой проверки:

// Обычная проверка дубликатов
$collection = collect(['a', 'b', 'A', 'a', 'B', 'b']);
$duplicates = $collection->duplicates();      
// Result: [3 => 'a', 5 => 'b'] // Без учета регистра

// Строгая проверка дубликатов
$strictDuplicates = $collection->duplicatesStrict();
// Result: [3 => 'a', 5 => 'b'] // С учетом регистра

Работа с массивами и объектами

Проверка на наличие дубликатов в определенных атрибутах:

$employees = collect([
    ['email' => 'abigail@example.com', 'position' => 'Developer'],
    ['email' => 'james@example.com', 'position' => 'Designer'],
    ['email' => 'victoria@example.com', 'position' => 'Developer']
]);

$duplicatePositions = $employees->duplicates('position');
// Result: [2 => 'Developer']

Реальный пример

Рассмотрим, как это можно использовать в сервисе валидации данных:

class DataValidator
{
    public function validateUniqueEmails(Collection $users)
    {
        // Обычная проверка дубликатов электронных писем
        $duplicates = $users->duplicates('email');
        
        if ($duplicates->isNotEmpty()) {
            throw new ValidationException(
                "Duplicate emails found: " . 
                $duplicates->implode(', ')
            );
        }
    }
    
    public function findDuplicateTags(Collection $tags)
    {
        return [
            'case_insensitive' => $tags->duplicates(),
            'case_sensitive' => $tags->duplicatesStrict()
        ];
    }
    
    public function checkUniqueTags(Collection $posts)
    {
        $tags = collect([
            'php', 'PHP', 'php', 'laravel', 'Laravel', 'LARAVEL'
        ]);
        
        return [
            'basic_duplicates' => $tags->duplicates(),
            // Result: [2 => 'php', 4 => 'Laravel']
            
            'case_sensitive_duplicates' => $tags->duplicatesStrict(),
            // Result: [2 => 'php']
        ];
    }
}

Метод `duplicates` позволяет легко выявлять повторяющиеся значения в коллекциях, обеспечивая целостность и валидность данных.