7

是否有一种“更好”的方式(内置函数,更好的算法)来规范 PHP 数组中所有键的大小写?循环并创建一个新数组有效

$new = array();
foreach( $old as $key=>$value) {
    $key = strToLower($key);
    if(!array_key_exists($key,$new) {
        $new[$key] = $value;
    } 
    else {
        throw new Exception('Duplicate Key Encountered');
    }

}

但似乎这些应该是“就地”做到这一点的一种方式。

更新:看起来有一个内置的,没有欺骗性地命名但我不知何故错过了array_change_key_case。我仍然很乐意看到可以让您更好地处理当您点击“重复”键时发生的事情的算法方法。

4

5 回答 5

13

我相信array_change_key_case你正在寻找什么。

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

于 2009-07-21T20:43:14.223 回答
4

我发现在处理大型数组时,内置函数比循环快得多这可能会做你想要的(未经测试的代码):

$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));

编辑或务实的方法(应该更快):

$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!');
}
于 2009-07-21T21:04:30.793 回答
3

您可以使用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.");
}
于 2009-07-21T20:43:37.437 回答
0
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;
}
于 2009-07-21T20:43:12.117 回答
0

支持多维数组,灵感来自此 PHP 手册注释

function array_change_key_case_recursive($input, $case = CASE_LOWER)
{
    if (!is_array($input))
    {
        trigger_error("Invalid input array '{$array}'", E_USER_NOTICE);
        return false;
    }

    if (!in_array($case, array(CASE_UPPER, CASE_LOWER)))
    {
        trigger_error("Case parameter '{$case}' is invalid.", E_USER_NOTICE);
        return false;
    }

    $input = array_change_key_case($input, $case);

    foreach($input as $key => $array)
        if(is_array($array))
            $input[$key] = array_change_key_case_recursive($array, $case);

    return $input;
}

为了获得更好的性能,它使用原生的array_change_key_case() PHP 函数。

于 2011-12-14T14:38:30.087 回答