Array change key case: примеры (PHP)

Изменение регистра ключей массива: array_change_key_case
Раздел: Работа с массивами
array_change_key_case(array $array, int $case = CASE_LOWER): array

Функция array_change_key_case() изменяет регистр всех ключей в массиве на верхний или нижний. Она часто применяется для нормализации данных, когда источник массива (например, пользовательский ввод или другая система) может предоставлять ключи в различном регистре.

Описание функции и аргументов

Синтаксис функции: array_change_key_case(array $array, int $case = CASE_LOWER): array.

Аргументы функции

  • $array (обязательный): Исходный массив, ключи которого необходимо преобразовать. Если в массиве есть элементы с ключами, которые после преобразования станут одинаковыми (например, 'Key' и 'KEY'), значение последнего из них перезапишет предыдущие.
  • $case (необязательный): Константа, определяющая регистр для преобразования. Допустимые значения: CASE_LOWER (по умолчанию) и CASE_UPPER. CASE_LOWER приводит ключи к нижнему регистру, а CASE_UPPER — к верхнему.

Примеры использования array_change_key_case

Использование с CASE_LOWER (по умолчанию)

$array = ['Name' => 'Иван', 'Age' => 25];
$result = array_change_key_case($array);
print_r($result);
Array
(
    [name] => Иван
    [age] => 25
)

Использование с CASE_UPPER

$array = ['firstName' => 'Анна', 'lastName' => 'Петрова'];
$result = array_change_key_case($array, CASE_UPPER);
print_r($result);
Array
(
    [FIRSTNAME] => Анна
    [LASTNAME] => Петрова
)

Обработка конфликта ключей

$array = ['Key' => 'значение1', 'KEY' => 'значение2'];
$result = array_change_key_case($array);
print_r($result);
Array
(
    [key] => значение2
)

Похожие функции в PHP

Прямых аналогов для изменения регистра ключей в PHP немного, но существуют функции для работы с ключами массивов.

array_combine()

Создает массив, используя один массив для ключей, а другой для значений. Можно предварительно обработать массив ключей, изменив их регистр с помощью array_map('strtolower', $keys).

array_flip()

Меняет местами ключи и значения массива. После этого можно применить array_change_key_case() к новым ключам (бывшим значениям), а затем снова использовать array_flip(). Способ может быть полезен для изменения регистра значений, если они уникальны и являются строками.

Итерация с foreach

Использование цикла foreach позволяет более гибко обрабатывать ключи, например, изменять регистр выборочно или по сложным правилам.

Когда что использовать: array_change_key_case() предпочтительнее для простого и быстрого изменения регистра всех ключей. array_combine() с array_map() подходит, если ключи изначально находятся в отдельном массиве. Цикл foreach применяют для нестандартных преобразований.

Типичные ошибки при использовании

Перезапись значений при конфликте ключей

Если в исходном массиве есть ключи, которые после изменения регистра становятся одинаковыми, сохраняется значение последнего из них. Это может привести к неожиданной потере данных.

$data = ['ID' => 1, 'id' => 2];
$normalized = array_change_key_case($data, CASE_LOWER);
print_r($normalized);
Array
(
    [id] => 2
)

Обработка нестроковых ключей

Функция работает только со строковыми ключами. Если в массиве присутствуют ключи других типов (целые числа), они останутся без изменений, так как изменение регистра к ним не применяется.

$array = [0 => 'ноль', 'Key' => 'значение'];
$result = array_change_key_case($array);
print_r($result);
Array
(
    [0] => ноль
    [key] => значение
)

Некорректный аргумент $case

Передача неверного значения вторым аргументом может привести к ошибке, начиная с PHP 8.0. До PHP 8.0 это вызывало предупреждение и использовало значение по умолчанию.

Изменения в последних версиях PHP

Начиная с PHP 8.0, функция array_change_key_case() выбрасывает исключение TypeError, если аргумент $case не является корректной константой (CASE_LOWER или CASE_UPPER). В более ранних версиях в такой ситуации выдавалось предупреждение, а функция использовала значение по умолчанию CASE_LOWER.

// В PHP 8.x
$array = ['Test' => 1];
// Передано недопустимое значение
$result = array_change_key_case($array, 123);
Fatal error: Uncaught TypeError: array_change_key_case(): Argument #2 ($case) must be either CASE_LOWER or CASE_UPPER

Это изменение делает код более строгим и помогает быстрее обнаруживать ошибки.

Расширенные примеры использования

Нормализация данных из формы

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

Пример php
// Предположим, $_POST содержит: ['UserName' => 'ivan', 'UserEmail' => 'test@example.com']
$postDataLower = array_change_key_case($_POST, CASE_LOWER);
// Теперь можно обращаться к данным по ключам в нижнем регистре
if (isset($postDataLower['username'])) {
    echo $postDataLower['username']; // ivan
}

Обработка многомерных массивов

Функция работает только на верхнем уровне массива. Для изменения регистра ключей во вложенных массивах потребуется рекурсивная обработка.

Пример php
function array_change_key_case_recursive(array $array, int $case = CASE_LOWER): array {
    $result = [];
    foreach ($array as $key => $value) {
        $newKey = is_string($key) ? (($case == CASE_UPPER) ? strtoupper($key) : strtolower($key)) : $key;
        $result[$newKey] = is_array($value) ? array_change_key_case_recursive($value, $case) : $value;
    }
    return $result;
}

$multiArray = ['First' => ['InnerKey' => 1], 'SECOND' => 2];
$recursiveResult = array_change_key_case_recursive($multiArray, CASE_LOWER);
print_r($recursiveResult);
Array
(
    [first] => Array
        (
            [innerkey] => 1
        )
    [second] => 2
)

Сравнение массивов без учета регистра ключей

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

Пример php
$array1 = ['KEY' => 'value'];
$array2 = ['key' => 'value'];
$normalized1 = array_change_key_case($array1);
$normalized2 = array_change_key_case($array2);
if ($normalized1 == $normalized2) {
    echo 'Массивы эквивалентны по ключам и значениям.';
}

Подготовка данных для JSON API с определенным регистром ключей

Некоторые API требуют, чтобы ключи JSON-объектов были в определенном регистре (например, camelCase или snake_case). Функция может помочь в стандартизации.

Пример php
$data = ['user_name' => 'Алексей', 'user_age' => 28];
// Преобразование ключей в camelCase (требуется дополнительная обработка)
$camelData = [];
foreach ($data as $key => $value) {
    $camelKey = lcfirst(str_replace('_', '', ucwords($key, '_')));
    $camelData[$camelKey] = $value;
}
// Для простого случая с нижним регистром:
$lowerData = array_change_key_case($data);
print_r($lowerData);

Аналоги в других языках программирования

Python

В Python нет встроенной функции для прямого изменения регистра ключей словаря, но это легко реализуется через генератор словаря.

original_dict = {'Name': 'John', 'Age': 30}
# Приведение ключей к нижнему регистру
lower_dict = {k.lower(): v for k, v in original_dict.items()}
print(lower_dict)
{'name': 'John', 'age': 30}

JavaScript

В JavaScript можно использовать Object.keys(), reduce() или цикл для создания нового объекта.

const obj = {Name: 'John', Age: 30};
const lowerObj = Object.keys(obj).reduce((acc, key) => {
    acc[key.toLowerCase()] = obj[key];
    return acc;
}, {});
console.log(lowerObj);
{ name: 'John', age: 30 }

MySQL

В MySQL операции над ключами не имеют прямого аналога, так как данные хранятся в таблицах с названиями столбцов. Однако можно изменить регистр названий столбцов при выборке, используя алиасы (AS).

SELECT column_name AS columnname FROM table_name;

Особенности: В отличие от PHP, где функция встроена, в Python и JavaScript для изменения регистра ключей используются более универсальные конструкции. Это предоставляет большую гибкость, но требует написания дополнительного кода.

PHP array_change_key_case function comments

En
Array change key case Changes the case of all keys in an array