在PHP中规范化数组键的大小写

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。我仍然很感兴趣地看到算法方法,让您更好地处理遇到“重复”键时会发生什么。


对于算法方法,我会选择soulmerge下面的“实用”版本。 - acrosman
这篇文章解释了你需要什么:http://blog.jterminal.com/2014/07/change-the-case-of-all-keys-in-an-array-with-array_change_key_case-function-in-php.html - Jasir
5个回答

13

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!');
}

1
是的,内置函数几乎总是更快的。当编译后的 C 与 PHP 优化代码相比时,猜猜谁会赢 :) - Alana Storm

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.");
}

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;
}

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函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接