2012-05-12 45 views
34

Tôi cần kiểm tra xem tất cả các giá trị trong một mảng có giống nhau không.Kiểm tra xem tất cả các giá trị trong mảng có giống nhau không

Ví dụ:

$allValues = array(
    'true', 
    'true', 
    'true', 
); 

Nếu mỗi giá trị trong mảng bằng 'true' sau đó tôi muốn để echo 'all true'. Nếu bất kỳ giá trị trong mảng bằng 'false' sau đó tôi muốn để echo 'some false'

Bất kỳ ý tưởng về làm thế nào tôi có thể làm điều này?

+0

Giá trị nhận được vào mảng như thế nào? Tại sao không kiểm tra chúng với một sự bình đẳng đơn giản khi chúng được chuyển lên mảng và giảm bớt sự cần thiết cho bất kỳ kiểm tra * thực tế sau * (và do đó, câu hỏi này). Nếu chúng đến từ cơ sở dữ liệu, thao tác này có thể được xử lý ở phía SQL. – rdlowrey

Trả lời

84

tất cả các giá trị tương đương với giá trị kiểm tra

if (count(array_unique($allvalues)) === 1 && end($allvalues) === 'true') { 


} 

hoặc chỉ thử nghiệm cho sự tồn tại của điều bạn không muốn.

if (in_array('false', $allvalues, true)) { 

} 

Ưu tiên phương pháp sau nếu bạn chắc chắn rằng chỉ có 2 giá trị có thể có trong mảng, vì nó hiệu quả hơn nhiều. Nhưng nếu nghi ngờ, một chương trình chậm là tốt hơn so với một chương trình không chính xác, do đó, sử dụng phương pháp đầu tiên.

Nếu bạn không thể sử dụng phương pháp thứ hai, mảng của bạn rất lớn và nội dung của mảng là có khả năng có nhiều hơn 1 giá trị (đặc biệt là nếu giá trị có khả năng xảy ra gần đầu mảng), nó có thể là nhiều nhanh hơn để làm như sau: "không phải tất cả sự thật"

function isHomogenous($arr) { 
    $firstValue = current($arr); 
    foreach ($arr as $val) { 
     if ($firstValue !== $val) { 
      return false; 
     } 
    } 
    return true; 
} 
+6

thích phần sau ... kiểm tra sai thay vì đúng .. siêu hiệu quả ... – CodeMonkey

+0

cách thứ hai là tuyệt vời ... –

+2

tại sao chúng ta cần phần này? "end ($ allvalues) === 'true'" Ai đó có thể giải thích được không? – Tebe

0
$alltrue = 1; 
foreach($array as $item) { 
    if($item!='true') { $alltrue = 0; } 
} 
if($alltrue) { echo("all true."); } 
else { echo("some false."); } 

về mặt kỹ thuật này không kiểm tra cho "một số sai lầm," nó kiểm tra cho Nhưng có vẻ như bạn chắc chắn rằng các giá trị duy nhất bạn sẽ nhận được là 'true' và 'false'.

-2
$x = 0; 
foreach ($allvalues as $a) { 
    if ($a != $checkvalue) { 
     $x = 1; 
    } 
} 

//then check against $x 
if ($x != 0) { 
    //not all values are the same 
} 
9

Nếu mảng của bạn có chứa các phép toán luận thực tế (hoặc ints) thay vì chuỗi, bạn có thể sử dụng array_sum:

$allvalues = array(TRUE, TRUE, TRUE); 
if(array_sum($allvalues) == count($allvalues)) { 
    echo 'all true'; 
} else { 
    echo 'some false'; 
} 

http://codepad.org/FIgomd9X

này hoạt động vì TRUE sẽ được đánh giá như 1, và FALSE0.

0

Một tùy chọn khác:

function same($arr) { 
    return $arr === array_filter($arr, function ($element) use ($arr) { 
     return ($element === $arr[0]); 
    }); 
} 

Cách sử dụng:

same(array(true, true, true)); // => true 
5

Tại sao không chỉ so sánh đếm sau khi gọi array_unique()?

Để kiểm tra xem tất cả các yếu tố trong một mảng là như nhau, nên càng đơn giản như:

$allValuesAreTheSame = (count(array_unique($allvalues)) === 1); 

này nên hoạt động không phụ thuộc vào loại giá trị trong mảng.

+0

Vì "count (array_unique" trả về 1 – Andrew

+0

'1' sẽ chỉ được trả về nếu chỉ có một giá trị duy nhất trong mảng đầu vào. Hàm' array_unique() 'mất một mảng đầu vào và trả về một mảng mới không có giá trị trùng lặp. " – Werner

+0

Không, 1 sẽ được trả về nếu TẤT CẢ giá trị trong mảng là như nhau. Nếu tôi có mảng (5,5,5), nó sẽ trả về mảng (5) và so sánh Mã lỗi của bạn sẽ tạo ra kết quả sai. – Andrew

6

Ngoài ra, bạn có thể ngưng tụ câu trả lời dê trong trường hợp nó không phải là một nhị phân:

if (count(array_unique($allvalues)) === 1 && end($allvalues) === 'true') { 
    // ... 
} 

để

if (array_unique($allvalues) === array('foobar')) { 
    // all values in array are "foobar" 
} 
1

Bạn có thể so sánh min và max ... không phải là cách nhanh nhất; p

$homogenous = (min($array) === max($array)); 
Các vấn đề liên quan