2012-09-05 11 views
5

Tengo una matriz que contiene varios objetos. ¿Es posible verificar si existe un valor en cualquiera de los objetos, por ej. id-> 27 sin bucle? De manera similar a la función in_array() de PHP. Gracias.¿Es posible verificar si existe un valor dentro de una matriz llena de objetos sin bucle?

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

Respuesta

4

No. Si a menudo necesita búsqueda directa rápida de valores, necesita usar teclas de matriz para t dobladillo, que son muy rápidos para buscar. Por ejemplo:

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

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

Si usted necesita para buscar objetos por diferentes teclas, por lo que puede en realidad no les índice por una clave específica, es necesario mirar en diferentes estrategias de búsqueda como binary searches.

0

Usted puede hacer:

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

sin bucle? – Stu

+0

dijiste sin hacer un bucle a través de toda la matriz – gorgi93

+1

Haha cierto. Cambiaré apropiadamente. – Stu

1

array_search - Busca en la matriz para un valor dado y devuelve la clave correspondiente si tiene éxito

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

Si bien es una buena función, no funcionará para OP, porque necesita verificar un campo en los valores de la matriz, no el valor en sí mismo, y 'array_search' no acepta la función de comparación –

2

Tendrá que hacer bucles de una forma u otra, pero no tiene que implementar el bucle manualmente. Eche un vistazo a array_filter function. Todo lo que necesita hacer es proporcionar una función que comprueba los objetos, algo como esto:

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

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

O incluso se puede hacer esto en una sola línea:

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

Esto es potencialmente muy inútil, ya que no se rompe una vez que se encuentra el valor, pero siempre se repite a través de todos ellos. – deceze

+0

@deceze De acuerdo. La pregunta es qué tan grande es su matriz. Si está lidiando con millones de artículos, esto no será bueno. Si la matriz contiene solo algunos elementos (incluso algunos cientos), el impacto será insignificante. –

+0

'empty' no funciona en los valores de devolución de función, y no hay necesidad de usarlo aquí de todos modos. Una comparación booleana pura está bien. – deceze

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

No use '! Empty ($ var)' cuando solo quiere decir '$ var'. – deceze

+0

Tu derecha, voy a editar en consecuencia. –

Cuestiones relacionadas