2012-09-05 17 views
5

Tôi có một mảng chứa nhiều đối tượng. Có thể kiểm tra xem một giá trị có tồn tại trong bất kỳ đối tượng nào không, ví dụ: id-> 27 không có vòng lặp? Theo cách tương tự với hàm in_array() của PHP. Cảm ơn.Có thể kiểm tra xem một giá trị có tồn tại bên trong một mảng đầy đủ các đối tượng không có vòng lặp không?

> array(10)[0]=>Object #673 
        ["id"]=>25 
        ["name"]=>spiderman 
      [1]=>Object #674 
        ["id"]=>26 
        ["name"]=>superman 
      [2]=>Object #675 
        ["id"]=>27 
        ["name"]=>superman 
      ....... 
      ....... 
      ......... 

Trả lời

4

số Nếu bạn thường cần tra cứu trực tiếp các giá trị nhanh chóng, bạn cần sử dụng các phím mảng cho t hem, nhanh như chớp để tra cứu. Ví dụ:

// prepare once 
$indexed = array(); 
foreach ($array as $object) { 
    $indexed[$object->id] = $object; 
} 

// lookup often 
if (isset($indexed[42])) { 
    // object with id 42 exists... 
} 

Nếu bạn cần để tra cứu đối tượng bằng các phím khác nhau, vì vậy bạn có thể không thực sự index chúng bằng một chìa khóa cụ thể, bạn cần phải nhìn vào các chiến lược tìm kiếm khác nhau như binary searches.

0

Bạn có thể làm:

foreach ($array as $value) 
{ 
    if ($value == "what you are looking for") 
     break; 
} 
+0

Nếu không có vòng lặp? – Stu

+0

bạn nói mà không lặp qua toàn bộ mảng – gorgi93

+1

Haha đúng. Tôi sẽ thay đổi một cách thích hợp. – Stu

1

array_search - Tìm kiếm các mảng cho một giá trị nhất định và trả về chìa khóa tương ứng nếu thành công

$key = array_search('your search', $array); 
+1

Trong khi đó là một hàm tốt, nó sẽ không hoạt động cho OP, bởi vì anh ta cần kiểm tra một trường trong các giá trị của mảng, không phải giá trị của chính nó - và 'array_search' không chấp nhận hàm so sánh –

2

Bạn sẽ cần lặp lại theo cách này hay cách khác - nhưng bạn không phải tự thực hiện vòng lặp theo cách thủ công. Hãy xem array_filter function. Tất cả bạn cần làm là để cung cấp một chức năng để kiểm tra các đối tượng, một cái gì đó như thế này:

function checkID($var) 
{ 
    return $var->id == 27; 
} 

if(count(array_filter($input_array, "checkID")) { 
    // you have at least one matching element 
} 

Hoặc thậm chí bạn có thể làm điều này trong một dòng:

if(count(array_filter($input_array, function($var) { return $var->id == 27; })) { 
    // you have at least one matching element 
} 
+0

Điều này có khả năng rất lãng phí, vì nó không phá vỡ một khi giá trị được tìm thấy, nhưng luôn luôn lặp qua tất cả chúng. – deceze

+0

@deceze Đồng ý. Câu hỏi đặt ra là mảng của anh ta lớn cỡ nào. Nếu anh ấy đối phó với hàng triệu vật phẩm, điều này sẽ không tốt. Nếu mảng chỉ chứa một vài mục (thậm chí một vài trăm), tác động sẽ không đáng kể. –

+0

'empty' không hoạt động trên các giá trị trả về hàm, và không cần phải sử dụng nó ở đây. Một so sánh boolean thuần túy là tốt. – deceze

3
$results = array_filter($array, function($item){ 
    return ($item->id === 27); 
}); 
if ($results) 
{ 
    .. You have matches 
} 
+0

Không sử dụng '! Empty ($ var)' khi bạn chỉ có nghĩa là '$ var'. – deceze

+0

Quyền của bạn, tôi sẽ chỉnh sửa cho phù hợp. –

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