2010-03-12 9 views
7

Tengo una matriz dentro de una matriz.php Comprobación de si el valor existe en la matriz

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

¿Cómo puedo comprobar si existe 'América' en la matriz? La matriz de América podría ser cualquier clave, y podría haber cualquier cantidad de subarreglos, por lo que una solución generalizada, por favor.

Mirando el manual php veo in_array, pero eso solo funciona para la capa superior. así que algo como in_array("America", $a) no funcionaría.

Gracias.

+1

Si todas las matrices solo contienen un valor, ¿por qué las coloca en matrices? ¿Por qué no solo tiene el valor asignado a esa clave? – animuson

+0

¿El guión solo buscará una o quizás una pequeña cantidad de elementos en una gran matriz multidimensional? ¿O buscará muchos elementos que podrían hacer que sea "más barato" crear una tabla/tabla hash plana de todos los elementos antes de buscar? – VolkerK

+0

Lo sentimos, en realidad había más valores en las matrices, traté de simplificarlo para la pregunta, supongo que fue contraproducente. – Mark

Respuesta

11

Una solución general sería:

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

La razón por la que elegí utilizar in_arrayy un bucle es: Antes de examinar los niveles más profundos de la estructura matriz, me aseguro, que el valor buscado no está en el nivel actual. De esta forma, espero que el código sea más rápido que hacer algún tipo de método de búsqueda profundidad-primero.


Por supuesto, si la matriz es siempre de 2 dimensiones y sólo desea buscar en este tipo de matrices, entonces esto es más rápido:

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

camino a goooo !! –

+0

Creo que el 'return' después de' if (is_array ...) 'es problemático. No puedes hacer una devolución por cada elemento. En cambio, solo deberías regresar si la llamada a 'deep_in_array' devuelve true. – middus

+0

Mi matriz siempre es bidimensional. Me encanta cómo ambas respuestas se llaman felix. :) ¿Tu segunda opción es más rápida que la del otro felix? – Mark

5

PHP no tiene una función nativa array_search_recursive(), pero puede definir uno:

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

No comprobado, pero se le ocurre la idea.

+0

Hola, Félix;) Podría ser más rápido que el mío porque recorres el conjunto una sola vez. En el otro lado, siempre examinará primero las matrices, aunque es posible que el valor de búsqueda ya exista en el nivel de la matriz actual. –

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 
Cuestiones relacionadas