Нормализуйте случай ключей массива в PHP

Библиотека реализует функциональность для узко ограниченной по объему цели, тогда как платформа имеет тенденцию быть набором библиотек, оказывающих поддержку для более широкого диапазона функций. Например, дескрипторы библиотеки System.Drawing.dll, тянущие функциональность, но, являются только одной частью полной платформы.NET.

7
задан Alan Storm 21 July 2009 в 20:50
поделиться

4 ответа

Я считаю, что array_change_key_case делает то, что вы ищете.

http://us3.php.net/manual/en/function.array-change- key-case.php

13
ответ дан 6 December 2019 в 09:21
поделиться

Я обнаружил, что встроенные функции намного быстрее циклов при обработке больших массивов. Это может сделать то, что вы хотите (непроверенный код):

$lowerCaseKeys = array_map('strtolower', array_keys($array));
$duplicates = array_filter(array_count_values($lowerCaseKeys), create_function('$count', 'return $count > 1;'));
if (!empty($duplicates)) {
    throw new Exception('duplicate keys found: ' . implode(',', array_keys($duplicates)));
}
# Recreate the array with lower-case keys
$array = array_combine($lowerCaseKeys, array_values($array));

EDIT Или прагматический подход (должен быть намного быстрее):

$lowerCaseKeyArray = array_change_key_case($array);
if (count($lowerCaseKeyArray) !== count($array)) {
    # You can extract the duplicate keys here as above, if you like
    throw new Exception('duplicate keys found!');
}
4
ответ дан 6 December 2019 в 09:21
поделиться

Вы можете использовать array_change_key_case () . Это может привести к перезаписи ключей массива, поэтому вы захотите сравнить размеры массива с помощью count () до и после изменения регистра ключа. Из-за counts () я не уверен, даст ли этот метод более высокую производительность или нет, вам придется его протестировать.

$new = array_change_key_case($old, CASE_LOWER);
if (count($new) < count($old)) {
    throw new Exception("Duplicate key encountered.");
}
3
ответ дан 6 December 2019 в 09:21
поделиться
foreach(array_keys($old) as $key) {
  $lower = strtolower($key);
  //if key is already lower case, do nothing
  if($key == $lower)
    continue;
  $value = $old[$key];
  unset($old[$key]);
  $old[$lower] = $value;
}
0
ответ дан 6 December 2019 в 09:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: