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

この 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 に答える
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 に答える