¿Es posible verificar si existe un valor dentro de una matriz llena de objetos sin hacer un bucle?

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

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

preguntado el 05 de septiembre de 12 a las 10:09

6 Respuestas

No. Si a menudo necesita una búsqueda directa rápida de valores, necesita usar claves de matriz para ellos, que son muy rápidas de 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 necesita buscar objetos por diferentes claves, por lo que realmente no puede indexarlos por una clave específica, debe buscar diferentes estrategias de búsqueda como búsquedas binarias.

Respondido el 05 de Septiembre de 12 a las 11:09

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

Respondido 07 Oct 16, 17:10

No use !empty($var) cuando solo te refieres $var. - deceze

Es posible que desee combinar dos funciones para obtener los resultados deseados.

array_search($aguja, array_column($array, 'key_field');

Creó un pequeño código para demostrar su uso.

<?php
$superheroes    =    [
    [
        "id"    =>    1,
        "name"  =>    "spiderman"
    ],
    [
        "id"    =>    2,
        "name"  =>    "superman"
    ],
    [
        "id"    =>    3,
        "name"  =>    "batman"
    ],
    [
        "id"    =>    4,
        "name"  =>    "robin"
    ],
];
$needle    =    'spiderman';
$index     =    array_search($needle, array_column($superheroes, "name"));
echo "Is $needle a superhero?<br/>";


//Comparing it like this is important because if the element is found at index 0, 
//array_search will return 0 which means false. Hence compare it with !== operator
if ( false !== $index ) {
    echo "yes";
} else {
    echo "no";
}
?>

respondido 29 nov., 18:17

Deberá hacer bucles de una forma u otra, pero no tiene que implementar manualmente el bucle usted mismo. Mira esto array_filter función. Todo lo que necesita hacer es proporcionar una función que verifique 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 puedes hacer esto en una línea:

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

Respondido el 05 de Septiembre de 12 a las 11:09

Esto es potencialmente un gran desperdicio, ya que no se rompe una vez que se encuentra el valor, sino que siempre itera a través de todos ellos. - deceze

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

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

@deceze Lo sé. No estoy seguro de lo que sucedió allí: edité mi publicación antes, eliminando empty - pero volvió a aparecer. Edité de nuevo. - aleks g

Tu puedes hacer:

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

Respondido el 05 de Septiembre de 12 a las 11:09

dijiste sin recorrer toda la matriz - gorgi93

Jaja cierto. Cambiaré apropiadamente. - Stu

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

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

Respondido el 05 de Septiembre de 12 a las 11:09

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í, y array_search no acepta la función de comparación - aleks g

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.