2009-07-21 58 views
7

Có cách nào "tốt hơn" (hàm dựng sẵn, thuật toán tốt hơn) để chuẩn hóa trường hợp của tất cả các khóa trong một mảng PHP không? Lặp lại và tạo mảng mới hoạt độngChuẩn hóa trường hợp các phím mảng trong 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'); 
    } 

} 

nhưng có vẻ như đây là cách để thực hiện điều này "tại chỗ".

Cập nhật: Dường như có tích hợp sẵn, không được đặt tên theo cách nào đó nhưng bị mất bởi tôi array_change_key_case. Tôi vẫn rất thú vị khi thấy các phương pháp tiếp cận thuật toán sẽ cho phép bạn xử lý tốt hơn những gì xảy ra khi bạn nhấn các phím "trùng lặp".

+0

Đối với phương pháp tiếp cận thuật toán, tôi sẽ đi với phiên bản "thực dụng" của soulmerge bên dưới. – acrosman

+0

[Bài đăng này] (http://blog.jterminal.com/2014/07/change-the-case-of-all-keys-in-an-array-with-array_change_key_case-function-in-php.html) giải thích những gì bạn cần – Jasir

Trả lời

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

Bạn có thể sử dụng array_change_key_case(). Điều này có thể khiến các khóa mảng bị ghi đè, vì vậy bạn sẽ muốn so sánh các kích thước mảng bằng cách sử dụng count() trước và sau khi bạn thực hiện thay đổi quan trọng. Vì số đếm(), tôi không chắc liệu phương pháp này có mang lại hiệu suất tốt hơn cho bạn hay không, bạn phải chuẩn bị nó.

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

tôi thấy rằng các chức năng được xây dựng trong những nhiều nhanh hơn so với các vòng lặp khi xử lý mảng lớn. Điều này có thể làm những gì bạn muốn (mã chưa được kiểm tra):

$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 Hoặc cách tiếp cận thực dụng (nên nhanh hơn nhiều):

$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

Vâng, nội trang hầu hết sẽ luôn nhanh hơn. Khi nó được biên dịch C so với PHP Opt-Code, đoán ai thắng :) –

0

Hỗ trợ cho các mảng đa chiều, lấy cảm hứng từ 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; 
} 

Để có hiệu suất tốt hơn, nó sử dụng hàm PHP array_change_key_case() gốc.

Các vấn đề liên quan