validar multidimensional index in_array from false buscar array php arrays multidimensional-array

php - index - in_array() y matriz multidimensional



php i in array (19)

¿qué pasa con array_search? Parece bastante más rápido que Foreach según https://gist.github.com/Ocramius/1290076 ..

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

Uso in_array() para verificar si existe un valor en una matriz como la que se muestra a continuación.

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

pero ¿qué pasa con una matriz multidimensional (a continuación)? ¿Cómo puedo verificar ese valor si existe en la matriz múltiple?

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

o ¿no debería usar in_array() cuando llega a la matriz multidimensional?


Aquí está mi propuesta basada en la solución json_encode () con:

  • Opción no sensible a mayúsculas
  • devolviendo el conteo en lugar de verdadero
  • En cualquier lugar en matrices (claves y valores).

Si no se encuentra la palabra, todavía devuelve 0 igual a falso .

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); }

Espero eso ayude.


Creo que puedes usar array_key_exists hoy en día:

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


Esta es la primera función de este tipo que encontré en el manual de php para in_array . Las funciones en las secciones de comentarios no siempre son las mejores, pero si no hacen el truco, también puedes mirar allí :)

<?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; } ?>


Estaba buscando una función que me permitiera buscar tanto cadenas como matrices (como una aguja) en la matriz (pajar), así que agregué la respuesta a @jwueller .

Aquí está mi código:

/** * 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; }


Esto funcionará también.

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

Uso:

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


Esto lo hará:

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

in_array solo funciona en una matriz unidimensional, por lo que debe recorrer cada matriz secundaria y ejecutar in_array en cada una.

Como han señalado otros, esto solo será para una matriz bidimensional. Si tiene más matrices anidadas, una versión recursiva sería mejor. Vea las otras respuestas para ejemplos de eso.


Gran función, pero no me funcionó hasta que agregué if($found) { break; } if($found) { break; } al 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; }


La solución aceptada (en el momento de la escritura) por

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; }

Es perfectamente correcto, pero puede tener un comportamiento involuntario al realizar una comparación débil (el parámetro $strict = false ).

Debido al tipo de malabares de PHP al comparar valores de diferentes tipos, ambos

"example" == 0

y

0 == "example"

Evalúa true porque "example" se convierte en int y se convierte en 0 .

(Consulte ¿Por qué PHP considera que 0 es igual a una cadena? )

Si este no es el comportamiento deseado , puede ser conveniente convertir valores numéricos en cadenas antes de hacer una comparación no estricta:

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


Por favor, inténtalo:

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

No estoy seguro de la necesidad, pero esto podría funcionar para su requerimiento


Si sabe en qué columna buscar, puede usar array_search () y 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''; }

Esta idea está en la sección de comentarios para array_search () en el manual de PHP;


Siempre podría serializar su matriz multidimensional y realizar una serie de strpos :

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

Varios documentos para las cosas que he usado:


También funciona creando primero una nueva matriz unidimensional a partir de la original.

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


Versión más corta, para matrices multidimensionales creadas en base a los conjuntos de resultados de la base de datos.

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'');

Volverá si la matriz $ os_list contiene ''XP'' en el campo os_version.



si tu matriz como esta

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

Utilizar esta

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; }

ejemplo: echo in_multiarray("22", $array,"Age");


in_array() no funciona en matrices multidimensionales. Podrías escribir una función recursiva para hacer eso por ti:

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; }

Uso:

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


Para niños multidimensionales: in_array(''needle'', array_column($arr, ''key''))

Para One Dimensional Children: in_array(''needle'', call_user_func_array(''array_merge'', $arr))


$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''; }