PHP

2009-07-21 11 views
7

में सरणी कुंजियों के मामले को सामान्यीकृत करें क्या PHP सरणी में सभी कुंजियों के मामले को सामान्य करने के लिए "बेहतर" तरीका (अंतर्निहित फ़ंक्शन, बेहतर एल्गोरिदम) है? हालांकि लूपिंग और एक नया सरणी बनाने का काम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 द्वारा याद किया। मैं अभी भी एल्गोरिदमिक दृष्टिकोण देखने में रूचि रखूंगा जो आपको बेहतर तरीके से संभालने देगा जब आप "डुप्लिकेट" कुंजी दबाते हैं।

+0

एल्गोरिदमिक दृष्टिकोण के लिए मैं नीचे आत्माम के "व्यावहारिक" संस्करण के साथ जाऊंगा। – acrosman

+0

[यह पोस्ट] (http://blog.jterminal.com/2014/07/change-the-case-of-all-keys-in-an-array-with-array_change_key_case-function-in-php.html) बताता है कि आपको क्या चाहिए – Jasir

उत्तर

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

आप array_change_key_case() इस्तेमाल कर सकते हैं। यह सरणी कुंजियों को ओवरराइट करने का कारण बन सकता है, इसलिए आप कुंजी केस परिवर्तन करने से पहले और बाद में count() का उपयोग करके सरणी आकारों की तुलना करना चाहेंगे। गणना() के कारण, मुझे यकीन नहीं है कि यह विधि आपको बेहतर प्रदर्शन प्रदान करेगी या नहीं, आपको इसे बेंचमार्क करना होगा।

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

मैंने पाया कि builtin कार्यों ज्यादा छोरों की तुलना में तेजी से जब बड़े सरणियों प्रसंस्करण कर रहे हैं। यह वही है आप (अपरीक्षित कोड) चाहते हो सकता है:

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

हाँ, बिल्टिन लगभग हमेशा तेज होने जा रहे हैं। जब यह संकलित सी बनाम PHP ऑप्ट-कोड है, अनुमान लगाओ कौन जीतता है :) –

0

बहुआयामी सरणियों के लिए समर्थन, 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 फ़ंक्शन का उपयोग करता है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^