2011-08-09 40 views
51

Chỉ cần tự hỏi nếu bạn có thể cho tôi một bàn tay với điều này:PHP: Kiểm tra xem giá trị và quan trọng tồn tại trong mảng đa chiều

Tôi có một mảng đa chiều ...

$my_array = array( 
     0 => array( 
      "name" => "john", 
      "id" => 4 
     ), 
     1 => array( 
      "name" => "mark", 
      "id" => 152 
     ), 
    2 => array( 
      "name" => "Eduard", 
      "id" => 152 
     ) 
); 

Bất kỳ ý tưởng về những gì sẽ là cách nhanh nhất và hiệu quả nhất để kiểm tra xem mảng $ my_array có chứa bất kỳ giá trị nào có khóa "id" và giá trị của nó là 152 không. Tôi không cần phải lặp lại hoặc sử dụng bất kỳ giá trị nào. Tôi chỉ cần kiểm tra (trả về true) nếu mảng có bất kỳ bản ghi nào có ID "key" và giá trị "152" trong đó.

+0

nên cậu tìm ra cách tốt nhất xung quanh? –

Trả lời

58

Không có gì sẽ nhanh hơn vòng lặp đơn giản. Bạn có thể trộn và kết hợp một số hàm mảng để làm điều đó, nhưng chúng sẽ chỉ được thực hiện như một vòng lặp.

function whatever($array, $key, $val) { 
    foreach ($array as $item) 
     if (isset($item[$key]) && $item[$key] == $val) 
      return true; 
    return false; 
} 
+1

Điều này là tuyệt vời cho mảng duy nhất nhưng nếu bạn đang tìm kiếm mảng đa chiều sau đó kiểm tra phiên bản sửa đổi của tôi –

7

Nếu bạn phải kiếm được nhiều tra cứu "id" và nó phải thực sự nhanh chóng, bạn nên sử dụng một mảng thứ hai chứa tất cả các "id" như phím:

$lookup_array=array(); 

foreach($my_array as $arr){ 
    $lookup_array[$arr['id']]=1; 
} 

Bây giờ bạn có thể kiểm tra một id hiện rất nhanh, ví dụ:

echo (isset($lookup_array[152]))?'yes':'no'; 
2
return 0 < count(
    array_filter(
     $my_array, 
     function ($a) { 
      return array_key_exists('id', $a) && $a['id'] == 152; 
     } 
    ) 
); 

Lưu ý: array_key_exists gọi là tùy chọn. Nó chỉ cho vay để mã hóa sự khó khăn.

17

Dưới đây là một phiên bản cập nhật của câu trả lời Dan Grossman của mà sẽ phục vụ cho mảng đa chiều (những gì tôi đã sau):

function find_key_value($array, $key, $val) 
{ 
    foreach ($array as $item) 
    { 
     if (is_array($item) && find_key_value($item, $key, $val)) return true; 

     if (isset($item[$key]) && $item[$key] == $val) return true; 
    } 

    return false; 
} 
0

tôi đã viết các chức năng sau đây để xác định xem một mảng đa chiều một phần có chứa một số giá trị.

function findKeyValue ($array, $needle, $value, $found = false){ 
    foreach ($array as $key => $item){ 
     // Navigate through the array completely. 
     if (is_array($item)){ 
      $found = $this->findKeyValue($item, $needle, $value, $found); 
     } 

     // If the item is a node, verify if the value of the node contains 
     // the given search parameter. E.G.: 'value' <=> 'This contains the value' 
     if (! empty($key) && $key == $needle && strpos($item, $value) !== false){ 
      return true; 
     } 
    } 

    return $found; 
} 

Gọi chức năng như thế này:

$this->findKeyValue($array, $key, $value); 
8

** PHP> = 5,5

chỉ đơn giản là u có thể sử dụng

$key = array_search(40489, array_column($userdb, 'uid')); 

Giả sử mảng đa chiều này:

$userdb=Array 
(
(0) => Array 
    (
     (uid) => '100', 
     (name) => 'Sandra Shush', 
     (url) => 'urlof100' 
    ), 

(1) => Array 
    (
     (uid) => '5465', 
     (name) => 'Stefanie Mcmohn', 
     (pic_square) => 'urlof100' 
    ), 

(2) => Array 
    (
     (uid) => '40489', 
     (name) => 'Michael', 
     (pic_square) => 'urlof40489' 
    ) 
); 

$key = array_search(40489, array_column($userdb, 'uid')); 
+2

Tại sao không đơn giản '$ ids = array_column ($ array, 'id', 'id');' và sau đó 'isset ($ id [40489]) '? –

+0

Xin chào, bạn có muốn cập nhật câu trả lời của mình và thực hiện nhận xét từ Elias không? – leymannx

0

Sử dụng một array_map()

$ tùy chọn là mảng mà bạn đang tìm kiếm.

$arr = array_map(function($ar) { 
    if(array_key_exists('name_of_the_key_you_search_for',$ar)){ 
     return true; 
    }else{ 
     return false; 
    } 
},$options ); 
var_dump($arr); //just for test, remove in the code 
4

Trong câu hỏi của bạn, thực sự là một mảng 2-D đơn giản, sẽ không tốt hơn sao?Có một look-

Hãy nói 2-D tên mảng $ my_array và giá trị của bạn để tìm là $ id

function idExists($needle='', $haystack=array()){ 
    //now go through each internal array 
    foreach ($haystack as $item) { 
     if ($item['id']===$needle) { 
      return true; 
     } 
    } 
    return false; 
} 

và gọi nó là:

idExists($id, $my_array); 

Như bạn có thể thấy, nó thực sự chỉ kiểm tra xem có bất kỳ chỉ mục nội bộ nào có id key_name 'id' hay không, có giá trị $ của bạn. Một số câu trả lời khác ở đây cũng có thể là kết quả đúng nếu tên của key_name 'cũng có giá trị $

1

Hãy thử với mã bên dưới này. Nó sẽ làm việc tốt cho bất kỳ loại tìm kiếm mảng đa chiều.

đây bạn có thể nhìn thấy LIVE DEMO EXAMPLE

function multi_array_search($search_for, $search_in) { 
    foreach ($search_in as $element) { 
     if (($element === $search_for)){ 
      return true; 
     }elseif(is_array($element)){ 
      $result = multi_array_search($search_for, $element); 
      if($result == true) 
       return true; 
     } 
    } 
    return false; 
} 
1

Một giải pháp tốt có thể được cung cấp bởi một @Elias Van Ootegan trong một chú thích đó là:

$ids = array_column($array, 'id', 'id'); 
echo isset($ids[40489])?"Exist":"Not Exist"; 

Tôi đã thử nó và làm việc cho tôi, cảm ơn bạn.

Sửa

Lưu ý: Nó sẽ làm việc trong PHP 5.5+

+1

Lưu ý rằng 'mảng_column' yêu cầu PHP 5.5+ - http://php.net/manual/en/function.array-column.php –

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