2010-03-12 66 views
7

Tôi có một mảng trong một mảng.php Kiểm tra nếu giá trị tồn tại trong mảng của mảng

$a = array (0 => array ('value' => 'America',), 1 => array ('value' => 'England',),) 

Làm cách nào để kiểm tra xem 'Mỹ' có tồn tại trong mảng không? Mảng Mỹ có thể là chìa khóa bất kỳ, và có thể có bất kỳ số lượng subarrays nào, do đó, một giải pháp tổng quát.

Nhìn vào hướng dẫn sử dụng php tôi thấy in_array, nhưng chỉ hoạt động với lớp trên cùng. vì vậy một cái gì đó như in_array("America", $a) sẽ không hoạt động.

Cảm ơn.

+1

Nếu tất cả các mảng chỉ chứa một giá trị tại sao bạn đặt chúng vào mảng? Tại sao không chỉ có giá trị được gán cho khóa đó? – animuson

+0

Kịch bản sẽ chỉ tìm kiếm một hoặc có thể là một lượng nhỏ các phần tử trong một mảng đa chiều lớn? Hoặc nó sẽ tìm kiếm rất nhiều yếu tố có thể làm cho nó "rẻ hơn" để tạo ra một hashtable phẳng/mảng của tất cả các yếu tố trước khi tìm kiếm? – VolkerK

+0

Xin lỗi, thực sự có nhiều giá trị hơn trong mảng, tôi đã cố gắng đơn giản hóa nó cho câu hỏi, tôi đoán là đã bị phản tác dụng. – Mark

Trả lời

11

Một giải pháp chung sẽ là:

function deep_in_array($needle, $haystack) { 
    if(in_array($needle, $haystack)) { 
     return true; 
    } 
    foreach($haystack as $element) { 
     if(is_array($element) && deep_in_array($needle, $element)) 
      return true; 
    } 
    return false; 
} 

Lý do tại sao tôi đã chọn để sử dụng in_array một vòng lặp là: Trước khi tôi kiểm tra mức độ sâu sắc hơn về cấu trúc mảng, tôi chắc chắn rằng, rằng giá trị đã tìm kiếm không ở cấp độ hiện tại. Bằng cách này, tôi hy vọng mã sẽ nhanh hơn so với thực hiện một số phương thức tìm kiếm độ sâu đầu tiên.


Tất nhiên nếu mảng của bạn luôn luôn là 2 chiều và bạn chỉ muốn tìm kiếm trong các loại hình mảng, thì đây là nhanh hơn:

function in_2d_array($needle, $haystack) { 
    foreach($haystack as $element) { 
     if(in_array($needle, $element)) 
      return true; 
    } 
    return false; 
} 
+0

cách để goooo !! –

+0

Tôi nghĩ rằng 'return' sau' if (is_array ...) 'là vấn đề. Bạn không thể trả lại cho mỗi phần tử. Thay vào đó, bạn chỉ nên quay lại nếu lệnh gọi 'deep_in_array' trả về true. – middus

+0

Mảng của tôi luôn là hai chiều. Tôi thích cách cả hai câu trả lời được đặt tên là felix. :) Là lựa chọn thứ hai của bạn nhanh hơn so với felix khác? – Mark

5

PHP không có array_search_recursive() chức năng bản địa, nhưng bạn có thể xác định một:

function array_search_recursive($needle, $haystack) { 
    foreach ($haystack as $value) { 
     if (is_array($value) && array_search_recursive($needle, $value)) return true; 
     else if ($value == $needle) return true; 
    } 
    return false; 
} 

Chưa được kiểm tra nhưng bạn có ý tưởng.

+0

Hey Felix;) Có thể nhanh hơn tôi bởi vì bạn duyệt qua mảng chỉ một lần. Ở phía bên kia, bạn sẽ luôn luôn kiểm tra các mảng đầu tiên mặc dù giá trị tìm kiếm có thể đã tồn tại ở cấp mảng hiện tại. –

0
function search($a,$searchval){ //$a - array; $searchval - search value; 
if(is_array($a)) { 
foreach($a as $val){ 
if(is_array($val)) 
if(in_array($searchval,$val)) return true; 
} 
} 
else return false; 
} 

search($a, 'America'); //function call 
Các vấn đề liên quan