【问题标题】:Normalize the case of array keys in PHP规范化 PHP 中数组键的大小写
【发布时间】:2010-11-12 19:03:49
【问题描述】:

是否有一种“更好”的方式(内置函数、更好的算法)来规范 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 的“实用”版本。
  • This post 解释你需要什么

标签: php arrays key lowercase


【解决方案1】:

支持多维数组,灵感来自this PHP manual comment

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,内置插件几乎总是会更快。当它是编译 C 与 PHP Opt-Code 时,猜猜谁赢了 :)
    【解决方案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.");
    }
    

    【讨论】:

      【解决方案4】:

      我相信 array_change_key_case 可以满足您的需求。

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

      【讨论】:

        【解决方案5】:
        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;
        }
        

        【讨论】:

          猜你喜欢
          • 2017-05-14
          • 1970-01-01
          • 2013-11-07
          • 1970-01-01
          • 2020-01-01
          • 2017-06-15
          • 1970-01-01
          • 2022-01-12
          • 2017-01-30
          相关资源
          最近更新 更多