2009-07-21 8 views
7

Gibt es einen "besseren" Weg (eingebaute Funktion, besserer Algorithmus), um den Fall aller Schlüssel in einem PHP-Array zu normalisieren? obwohl Looping und Erstellen eines neuen Arrays arbeitetNormalisieren Sie den Fall von Array-Schlüsseln in 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'); 
    } 

} 

aber es scheint, als ob diese ein Weg sein, sollte diese „in place“ zu tun.

Update: Es sieht so aus, als wäre ein eingebaut, der nicht täuschend benannt, aber irgendwie von mir verpasst array_change_key_case. Ich würde immer noch interessante algorithmische Ansätze sehen, mit denen Sie besser mit dem umgehen können, was passiert, wenn Sie "doppelte" Schlüssel drücken.

+0

Für den algorithmischen Ansatz würde ich mit der "pragmatischen" Version von soulmerge weiter unten gehen. – acrosman

+0

[Dieser Beitrag] (http://blog.jterminal.com/2014/07/change-the-case-of-all-keys-in-an-array-with-array_change_key_case-function-in-php.html) erklärt, was Sie brauchen – Jasir

Antwort

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

könnten Sie array_change_key_case() verwenden. Dies kann dazu führen, dass die Array-Schlüssel überschrieben werden. Daher sollten Sie die Array-Größen mithilfe von count() vor und nach der Schlüsselfalländerung vergleichen. Aufgrund der counts() bin ich mir nicht sicher, ob diese Methode Ihnen eine bessere Leistung bringen würde oder nicht, Sie müssten sie vergleichen.

$new = array_change_key_case($old, CASE_LOWER); 
if (count($new) < count($old)) { 
    throw new Exception("Duplicate key encountered."); 
} 
4

Ich fand, dass eingebaute Funktionen viel schneller als Schleifen sind bei großen Arrays zu verarbeiten. Dies könnte das tun, was Sie (nicht getesteten Code) wollen:

$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 Oder den pragmatischen Ansatz (sollte viel schneller sein):

$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

Ja, Buildins werden fast immer schneller sein. Wenn es kompiliert C gegen PHP Opt-Code ist, rate wer gewinnt :) –

0

Unterstützung für mehrdimensionale Arrays, inspiriert von 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; 
} 

Für eine bessere Leistung verwendet es die native PHP-Funktion array_change_key_case().

Verwandte Themen