И ключ и значения массива перевести в нижний регистр PHP
К примеру есть ассоциативный массив, в котором нужно перевести и ключи и значения в нижний регистр
$output_arr = ["PAPIROSY" => "1 PACK", "VODKA" => "0,5 L"];
Два примера ниже позволяют справиться с задачей
array_map("strtolower", $output_arr);
array_change_key_case($output_arr, CASE_LOWER);
Но только в том случае, если в ключах и значениях латиница.
Как провернуть тоже самое для киррилицы?
Ответы (2 шт):
Кириллица у вас в 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"
Поскольку 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)