• Время чтения ~2 мин
  • 29.05.2025

Система сбора данных Laravel предоставляет метод diffKeys для определения различий между коллекциями на основе их ключей, а не значений, что позволяет выполнять задачи точного сравнения и управления конфигурацией.

Метод diffKeys сравнивает коллекции, изучая их ключевые структуры:

$collection = collect([
    'one' => 10,
    'two' => 20,
    'three' => 30,
    'four' => 40,
    'five' => 50,
]);
$diff = $collection->diffKeys([
    'two' => 2,
    'four' => 4,
    'six' => 6,
]);
// Result: ['one' => 10, 'three' => 30, 'five' => 50]

Этот метод оказывается особенно ценным в системах управления настройками:

class SettingsManager
{
    public function findDeprecatedSettings(array $currentSettings, array $supportedSettings)
    {
        return collect($currentSettings)
            ->diffKeys($supportedSettings)
            ->map(function ($value, $key) {
                return [
                    'setting' => $key,
                    'current_value' => $value,
                    'deprecated_at' => now()
                ];
            });
    }
    public function validateEssentialKeys(array $settings)
    {
        $essential = [
            'app_name' => null,
            'environment' => null,
            'debug_mode' => null
        ];
        $missing = collect($essential)
            ->diffKeys($settings)
            ->keys();

        if ($missing->isNotEmpty()) {
            throw new MissingSettingsException(
                'Essential settings missing: ' .
                $missing->implode(', ')
            );
        }
        return true;
    }
    public function compareEnvironments(array $production, array $staging)
    {
        $prodOnly = collect($production)->diffKeys($staging);
        $stagingOnly = collect($staging)->diffKeys($production);

        return [
            'production_only' => $prodOnly->all(),
            'staging_only' => $stagingOnly->all(),
            'total_differences' => $prodOnly->count() + $stagingOnly->count()
        ];
    }
}

Метод превосходен в сценариях управления разрешениями и доступом:

class PermissionManager
{
    public function findRevokedPermissions(array $previousPerms, array $currentPerms)
    {
        return collect($previousPerms)
            ->diffKeys($currentPerms)
            ->map(function ($granted, $permission) {
                return [
                    'permission' => $permission,
                    'was_granted' => $granted,
                    'revoked_at' => now()
                ];
            });
    }
    public function validateUserAccess(array $userPermissions, array $requiredAccess)
    {
        $missingAccess = collect($requiredAccess)
            ->diffKeys($userPermissions)
            ->keys();

        return [
            'has_access' => $missingAccess->isEmpty(),
            'missing_permissions' => $missingAccess->all()
        ];
    }
    public function auditPermissionChanges(array $before, array $after)
    {
        $added = collect($after)->diffKeys($before);
        $removed = collect($before)->diffKeys($after);

        return [
            'permissions_added' => $added->keys()->all(),
            'permissions_removed' => $removed->keys()->all(),
            'change_summary' => [
                'additions' => $added->count(),
                'removals' => $removed->count()
            ]
        ];
    }
}

Для управления флагами функций:

class FeatureFlagService
{
    public function syncFeatureFlags(array $serverFlags, array $clientFlags)
    {
        $serverOnly = collect($serverFlags)->diffKeys($clientFlags);
        $clientOnly = collect($clientFlags)->diffKeys($serverFlags);

        return [
            'flags_to_add' => $serverOnly->all(),
            'flags_to_remove' => $clientOnly->keys()->all(),
            'sync_required' => $serverOnly->isNotEmpty() || $clientOnly->isNotEmpty()
        ];
    }
    public function validateFeatureAccess(array $userFlags, array $requiredFeatures)
    {
        $unavailable = collect($requiredFeatures)
            ->diffKeys($userFlags)
            ->keys();

        if ($unavailable->isNotEmpty()) {
            throw new FeatureAccessException(
                'Access denied to features: ' . $unavailable->implode(', ')
            );
        }
        return true;
    }
}

Метод diffKeys оптимизирует задачи сравнения на основе ключей, фокусируясь на структурных различиях, а не на сравнении значений, что делает его идеальным для проверки конфигурации, аудита разрешений, и сценарии синхронизации.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Об авторе CrazyBoy49z
WORK EXPERIENCE
Контакты
Ukraine, Lutsk
+380979856297

Мы сбиваем «шахеды» каждый день. Каждое сбитие — спасённые жизни. Нам нужна мобильность: бус или прицеп. Каждый донат = ещё одна ночь под защитой.

🚐 Сбор на микроавтобус для моего экипажа, полк 1020 🎯 Цель: 500 000 ₴
🔗 Ссылка на банку 💳 4441 1111 2546 4663