代码之家  ›  专栏  ›  技术社区  ›  Alana Storm

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

  •  7
  • Alana Storm  · 技术社区  · 15 年前

    有没有更好的方法(内置函数,更好的算法)来规范化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 . 我仍然很有兴趣看到算法方法,它可以让你更好地处理当你点击“复制”键时发生的事情。

    5 回复  |  直到 13 年前
        1
  •  13
  •   acrosman    15 年前

    我相信 array_change_key_case 做你想要的。

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

        2
  •  4
  •   soulmerge    15 年前

    我发现内置函数是 许多的 处理大型数组时比循环更快。这可能会满足您的需要(未测试的代码):

    $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!');
    }
    
        3
  •  3
  •   zombat    15 年前

    你可以使用 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
  •  0
  •   Frank Farmer    15 年前
    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;
    }
    
        5
  •  0
  •   Maxime Pacary    13 年前

    支持多维数组,灵感来自 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函数。