¿Es posible verificar si existe un valor dentro de una matriz llena de objetos sin hacer un bucle?
Frecuentes
Visto 11,764 veces
5
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
.......
.......
.........
6 Respuestas
6
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
4
$results = array_filter($array, function($item){
return ($item->id === 27);
});
if ($results)
{
.. You have matches
}
Respondido 07 Oct 16, 17:10
3
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
2
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
0
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 php arrays oop or haz tu propia pregunta.
No use
!empty($var)
cuando solo te refieres$var
. - deceze