2010-02-16 19 views
27

Tôi đang cố gắng viết một vài dòng mã để tạo ra một hàm kiểu mảng duy nhất không phân biệt chữ hoa chữ thường. Dưới đây là những gì tôi có cho đến thời điểm này:không phân biệt dạng chữ array_unique

foreach ($topics as $value) { 
    $lvalue = strtolower($value); 
    $uvalue = strtolower($value); 

    if (in_array($value, $topics) == FALSE || in_array($lvalue, $topics) == FALSE || in_array($uvalue, $topics) == FALSE) { 
     array_push($utopics, $value); 
    } 
} 

Sự cố là câu lệnh if. Tôi nghĩ có gì đó sai với cú pháp của tôi, nhưng tôi khá mới với PHP và tôi không chắc nó là gì. Bất kỳ giúp đỡ?

Trả lời

46
function array_iunique($array) { 
    return array_intersect_key(
     $array, 
     array_unique(array_map("StrToLower",$array)) 
    ); 
} 
+1

Tuyệt vời! Cảm ơn! – williamg

+11

@ Pentium10: Bạn nên cung cấp tín dụng cho nguồn giải pháp của mình: http://www.php.net/manual/de/function.array-unique.php#78801 – sieppl

+3

tìm thấy tuyệt vời Pentium10, strtolower phải được báo giá mặc dù. – Orlymee

2

Bạn đang đặt cả hai lvalueuvalue xuống phiên bản chữ thường.

$uvalue = strtolower($value); 

nên

$uvalue = strtoupper($value); 

Điều đó nói rằng, điều này có thể nhanh hơn một chút. Việc thực hiện chức năng của bạn sẽ suy giảm theo cấp số nhân, trong khi điều này sẽ ít nhiều tuyến tính (tại một đoán, không phải là một chính comp-khoa học viễn tưởng ...)

<?php 

function array_iunique($ar) { 
    $uniq = array(); 
    foreach ($ar as $value) 
    $uniq[strtolower($value)] = $value; 
    return array_values($uniq); 
} 
?> 
+0

wow -.- đôi khi tôi đoán tôi chỉ cần một cặp mắt khác. cảm ơn! Điều đó vẫn không hoàn toàn làm điều đó, mặc dù. Không chắc chắn những gì sai ... Các giá trị được hiển thị là các giá trị trùng lặp (như jQuery và jQuery) cả hai đều hiển thị. Nhưng với các giá trị khác nhau (như php và PHP) thì không hiển thị. Weird ... – williamg

+0

Giải pháp tuyệt vời! Điều duy nhất làm tôi bực mình là hàm 'array_unique' ban đầu giữ nguyên các phím trong khi điều này không có nhưng tôi đoán nó không quan trọng trong trường hợp này. –

+1

@Tatu thật khó để bảo vệ các phím khi bạn loại bỏ một số dữ liệu ... bạn giữ chìa khóa nào? Người đầu tiên, hoặc người cuối cùng, hoặc một người được chọn ngẫu nhiên? – meagar

0

nên $ uvalue không được viết hoa? Vì vậy

$uvalue = strtoupper($value): 
0

và thay thế khác ...

function array_iunique($topics) { 

    $ltopics = array_map('strtolower', $topics); 
    $cleanedTopics = array_unique($ltopics); 

    foreach($topics as $key => $value) { 
     if(!isset($cleanedTopics[$key])) { 
      unset($topics[$key]); 
     } 
    } 

    return $topics; 

} 

Pentium10 là tốt hơn mặc dù.

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