И ключ и значения массива перевести в нижний регистр PHP

Рейтинг: 0Ответов: 2Опубликовано: 24.02.2023

К примеру есть ассоциативный массив, в котором нужно перевести и ключи и значения в нижний регистр

$output_arr = ["PAPIROSY" => "1 PACK", "VODKA" => "0,5 L"];

Два примера ниже позволяют справиться с задачей

array_map("strtolower", $output_arr);
array_change_key_case($output_arr, CASE_LOWER);

Но только в том случае, если в ключах и значениях латиница.

Как провернуть тоже самое для киррилицы?

Ответы

▲ 1Принят

Поскольку array_change_key_case() изначально не может в юникод, проще будет написать свой метод, который конвертирует сразу и ключ и значение:

$output_arr = array_reduce(
    // array_reduce не умеет находить ключи массива, поэтому
    // исп. функцию array_keys которая делает массив ключей и проходимся по ним 
    array_keys($output_arr),
    function($new, $key) use ($output_arr) { 
        // преобразовываем ключ в нижний регистр
        $newKey = mb_convert_case($key, MB_CASE_LOWER, "UTF-8");
        // заполняем новый массив значениями преобразованных ключа и значения
        $new[$newKey] = mb_convert_case($output_arr[$key], MB_CASE_LOWER, "UTF-8"); 
        // возвращаем новый массив в след. итерацию
        return $new; 
}, []); 
// третий аргумент, [], пустой массив, это изначальное значение 
// в которое будет собираться итоговый результат (в функции это переменная $new)
▲ 0

Кириллица у вас в UTF? Используйте mb_strtolower для элементов массива и функцию из примера в мануале (https://www.php.net/manual/ru/function.array-change-key-case.php), для конвертации ключей:

function array_change_key_case_unicode($arr, $c = CASE_LOWER) {
    $c = ($c == CASE_LOWER) ? MB_CASE_LOWER : MB_CASE_UPPER;
    foreach ($arr as $k => $v) {
        $ret[mb_convert_case($k, $c, "UTF-8")] = $v;
    }
    return $ret;
}

$arr = ["Первый" => "Один", "Second" => "Two"];
$out_arr = array_map("mb_strtolower", $arr);
$out_arr = array_change_key_case_unicode($out_arr, CASE_LOWER);
var_dump($out_arr);
exit;

Тут замечу, что у меня в php.ini при этом стоит настройка определения порядка кодировок:

mbstring.detect_order = "UTF-8, CP1251"