PHP dizi anahtarları davayı Normale

4 Cevap php

PHP dizideki tüm anahtarların davayı normalleştirmek için "iyi" bir yol (built-in fonksiyonu, daha iyi algoritma) var mı? Olsa döngü ve yeni bir dizi çalışmaların yaratılması

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

}

Bu "yerinde" bunu yapmak için bir yol olması gerektiği gibi ama görünüyor.

Update: bir inşa, aldatıcı bir şekilde bana göre cevapsız henüz adlı değil array_change_key_case var gibi görünüyor. Ben hala daha iyi tuşları "yinelenen" vurduğunuzda ne halledeyim istiyorum algoritmik yaklaşımlar görme ilginç olurdu.

4 Cevap

I array_change_key_case aradığınız ne yapar inanıyorum.

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

Ben büyük diziler işlerken yerleşik işlevleri döngüler daha much daha hızlı olduğu bulundu. Bu (denenmemiş kodu) istediğini yapabilir:

$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 Ya da pragmatik yaklaşımı (çok daha hızlı olmalıdır):

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

Sen kullanabilirsiniz array_change_key_case(). Bu dizi anahtarları yazılmasına neden olabilir, bu yüzden size anahtar durumunda değişiklik yapmadan önce ve sonra count() kullanarak dizisi boyutlarını karşılaştırmak isterim. Çünkü () sayıları, bu yöntem size daha iyi performans verecek veya olmaz, sen kriter onu olurdu emin değilim.

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

Esinlenerek boyutlu diziler, destek 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;
}

Daha iyi performans için, yerli array_change_key_case() PHP fonksiyonunu kullanır.