Intereting Posts

in_array () и многомерный массив

Я использую in_array() чтобы проверить, существует ли значение в массиве, как показано ниже,

 $a = array("Mac", "NT", "Irix", "Linux"); if (in_array("Irix", $a)) { echo "Got Irix"; } //print_r($a); 

но как насчет многомерного массива (ниже) – как я могу проверить это значение, существует ли он в мульти-массиве?

 $b = array(array("Mac", "NT"), array("Irix", "Linux")); print_r($b); 

или я не должен использовать in_array() когда приходит к многомерному массиву?

in_array() не работает на многомерных массивах. Вы можете написать рекурсивную функцию для этого:

 function in_array_r($needle, $haystack, $strict = false) { foreach ($haystack as $item) { if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) { return true; } } return false; } 

Применение:

 $b = array(array("Mac", "NT"), array("Irix", "Linux")); echo in_array_r("Irix", $b) ? 'found' : 'not found'; 

Это тоже сработает.

 function in_array_r($item , $array){ return preg_match('/"'.$item.'"/i' , json_encode($array)); } 

Применение:

 if(in_array_r($item , $array)){ // found! } 

Это сделает это:

 foreach($b as $value) { if(in_array("Irix", $value, true)) { echo "Got Irix"; } } 

in_array работает только с одномерным массивом, поэтому вам нужно перебирать каждый дополнительный массив и запускать in_array на каждом.

Как отмечали другие, это будет только для двумерного массива. Если у вас больше вложенных массивов, рекурсивная версия будет лучше. См. Другие ответы на примерах.

Если вы знаете, в каком столбце для поиска, вы можете использовать array_search () и array_column ():

 $userdb = Array ( (0) => Array ( ('uid') => '100', ('name') => 'Sandra Shush', ('url') => 'urlof100' ), (1) => Array ( ('uid') => '5465', ('name') => 'Stefanie Mcmohn', ('url') => 'urlof5465' ), (2) => Array ( ('uid') => '40489', ('name') => 'Michael', ('url') => 'urlof40489' ) ); if(array_search('urlof5465', array_column($userdb, 'url')) !== false) { echo 'value is in multidim array'; } else { echo 'value is not in multidim array'; } 

Эта идея содержится в разделе комментариев для array_search () в руководстве по PHP;

если ваш массив подобен этому

 $array = array( array("name" => "Robert", "Age" => "22", "Place" => "TN"), array("name" => "Henry", "Age" => "21", "Place" => "TVL") ); 

Использовать это

 function in_multiarray($elem, $array,$field) { $top = sizeof($array) - 1; $bottom = 0; while($bottom <= $top) { if($array[$bottom][$field] == $elem) return true; else if(is_array($array[$bottom][$field])) if(in_multiarray($elem, ($array[$bottom][$field]))) return true; $bottom++; } return false; } 

пример: echo in_multiarray("22", $array,"Age");

Отличная функция, но она не работала для меня, пока я не добавил if($found) { break; } if($found) { break; } в elseif

 function in_array_r($needle, $haystack) { $found = false; foreach ($haystack as $item) { if ($item === $needle) { $found = true; break; } elseif (is_array($item)) { $found = in_array_r($needle, $item); if($found) { break; } } } return $found; } 

Вы всегда можете сериализовать свой многомерный массив и сделать strpos :

 $arr = array(array("Mac", "NT"), array("Irix", "Linux")); $in_arr = (bool)strpos(serialize($arr),'s:4:"Irix";'); if($in_arr){ echo "Got Irix!"; } 

Различные документы для вещей, которые я использовал:

  • StrPos ()
  • сериализации ()
  • Тип Жонглирование или (bool)

Вот мое предложение, основанное на решении json_encode () :

  • нечувствительный к регистру вариант
  • возвращает значение count вместо true
  • где угодно в массивах (ключи и значения)

Если слово не найдено, оно все равно возвращает 0, равное false .

 function in_array_count($needle, $haystack, $caseSensitive = true) { if(!$caseSensitive) { return substr_count(strtoupper(json_encode($haystack)), strtoupper($needle)); } return substr_count(json_encode($haystack), $needle); } 

Надеюсь, поможет.

 $userdb = Array ( (0) => Array ( ('uid') => '100', ('name') => 'Sandra Shush', ('url') => 'urlof100' ), (1) => Array ( ('uid') => '5465', ('name') => 'Stefanie Mcmohn', ('url') => 'urlof5465' ), (2) => Array ( ('uid') => '40489', ('name') => 'Michael', ('url') => 'urlof40489' ) ); $url_in_array = in_array('urlof5465', array_column($userdb, 'url')); if($url_in_array) { echo 'value is in multidim array'; } else { echo 'value is not in multidim array'; } 

Я считаю, что вы можете просто использовать array_key_exists в настоящее время:

 <?php $a=array("Mac"=>"NT","Irix"=>"Linux"); if (array_key_exists("Mac",$a)) { echo "Key exists!"; } else { echo "Key does not exist!"; } ?> 

Это первая функция этого типа, которую я нашел в руководстве php для in_array . Функции в разделах комментариев не всегда лучшие, но если это не делает трюк, вы можете посмотреть там тоже 🙂

 <?php function in_multiarray($elem, $array) { // if the $array is an array or is an object if( is_array( $array ) || is_object( $array ) ) { // if $elem is in $array object if( is_object( $array ) ) { $temp_array = get_object_vars( $array ); if( in_array( $elem, $temp_array ) ) return TRUE; } // if $elem is in $array return true if( is_array( $array ) && in_array( $elem, $array ) ) return TRUE; // if $elem isn't in $array, then check foreach element foreach( $array as $array_element ) { // if $array_element is an array or is an object call the in_multiarray function to this element // if in_multiarray returns TRUE, than return is in array, else check next element if( ( is_array( $array_element ) || is_object( $array_element ) ) && $this->in_multiarray( $elem, $array_element ) ) { return TRUE; exit; } } } // if isn't in array return FALSE return FALSE; } ?> 

Он также работает, создавая сначала новый одномерный массив из исходного.

 $arr = array("key1"=>"value1","key2"=>"value2","key3"=>"value3"); foreach ($arr as $row) $vector[] = $row['key1']; in_array($needle,$vector); 

Более короткая версия для многомерных массивов, созданных на основе наборов результатов базы данных.

 function in_array_r($array, $field, $find){ foreach($array as $item){ if($item[$field] == $find) return true; } return false; } $is_found = in_array_r($os_list, 'os_version', 'XP'); 

Вернется, если массив $ os_list содержит «XP» в поле os_version.

Я искал функцию, которая позволила бы мне искать строки и массивы (как иглы) в массиве (стог сена), поэтому я добавил к ответу @jwueller .

Вот мой код:

 /** * Recursive in_array function * Searches recursively for needle in an array (haystack). * Works with both strings and arrays as needle. * Both needle's and haystack's keys are ignored, only values are compared. * Note: if needle is an array, all values in needle have to be found for it to * return true. If one value is not found, false is returned. * @param mixed $needle The array or string to be found * @param array $haystack The array to be searched in * @param boolean $strict Use strict value & type validation (===) or just value * @return boolean True if in array, false if not. */ function in_array_r($needle, $haystack, $strict = false) { // array wrapper if (is_array($needle)) { foreach ($needle as $value) { if (in_array_r($value, $haystack, $strict) == false) { // an array value was not found, stop search, return false return false; } } // if the code reaches this point, all values in array have been found return true; } // string handling foreach ($haystack as $item) { if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) { return true; } } return false; } 

как насчет array_search? Кажется, это довольно быстро, чем foreach в соответствии с https://gist.github.com/Ocramius/1290076 ..

 if( array_search("Irix", $a) === true) { echo "Got Irix"; } 

вы можете так использовать

 $result = array_intersect($array1, $array2); print_r($result); 

http://php.net/manual/tr/function.array-intersect.php

Пожалуйста попробуйте:

 in_array("irix",array_keys($b)) in_array("Linux",array_keys($b["irix"]) 

Я не уверен в необходимости, но это может сработать для вашего требования