¿Existe una función como in_array
, pero se puede usar en objetos?in_array - 'in_object' equivalente?
Respuesta
No, pero puede convertir el objeto en una matriz y pasarlo a in_array()
.
$obj = new stdClass;
$obj->one = 1;
var_dump(in_array(1, (array) $obj)); // bool(true)
Sin embargo, eso infringe todo tipo de principios de programación orientada a objetos. Vea mi comentario sobre su pregunta y Aron's answer.
Se puede convertir el objeto a una matriz:
$obj = new stdClass();
$obj->var = 'foobar';
in_array('foobar', (array)$obj); // true
En primer lugar, arrays y objects son bastante diferente.
Un objeto PHP no se puede iterar como una matriz de forma predeterminada. Una forma de implementar la iteración de objetos es implementar la interfaz Iterator.
En cuanto a su pregunta concreta, es probable que desee echar un vistazo a la ArrayAccess interface:
class obj implements ArrayAccess {
private $container = array();
public function __construct() {
$this->container = array(
"one" => 1,
"two" => 2,
"three" => 3,
);
}
public function offsetSet($offset, $value) {
if (is_null($offset)) {
$this->container[] = $value;
} else {
$this->container[$offset] = $value;
}
}
public function offsetExists($offset) {
return isset($this->container[$offset]);
}
public function offsetUnset($offset) {
unset($this->container[$offset]);
}
public function offsetGet($offset) {
return isset($this->container[$offset]) ? $this->container[$offset] : null;
}
}
Ahora puede acceder a su objeto como un conjunto de la siguiente manera:
$object = new obj();
var_dump(isset($obj['two'])); // exists!
var_dump(isset($obj['foo'])); // does not exist
Antes te vuelves loco con esto, por favor considera por qué estás tratando de hacer esto y mira los ejemplos en php.net.
Opción 2: cuando está simplemente tratando de ver si existe una propiedad, puede utilizar property_exists() para esto:
class foo {
public $bar = 'baz';
}
$object = new foo();
var_dump(property_exists($object, 'bar')); // true
Yo no lo recomiendo, porque es muy mala práctica pero puede usar get_object_vars.
Obtiene las propiedades accesibles no estáticas del objeto dado según el alcance.
Existen otras limitaciones que debe consultar en la documentación para ver si es adecuada para usted.
if(in_array('find me', get_object_vars($obj)))
function in_object($needle, $haystack) {
return in_array($needle, get_object_vars($haystack));
}
Es increíble cómo todas las personas pierden el punto de la utilidad de un método in_object PHP! Esto es lo que se me ocurrió, es muy útil, ¡y verá por qué!
Aquí hay una función simple que escribí que verificará si se puede encontrar un valor dentro de un objeto.
<?php
// in_object method
// to check if a value in an object exists.
function in_object($value,$object) {
if (is_object($object)) {
foreach($object as $key => $item) {
if ($value==$item) return $key;
}
}
return false;
}
?>
Esto es muy útil si se ha creado un objeto dinámicamente (especialmente de código externo, que no se ejerce control, como en una aplicación de complemento, CMS, etc.), y usted don' conocer las propiedades del objeto. La función anterior devolverá la propiedad, por lo que podrá usarla en su código más adelante.
Aquí hay un muy buen ejemplo básico de cuán útil es esta función.
<?php
class My_Class {
function __construct($key, $value) {
$this->$key = $value;
// As you can see, this is a dynamic class, its properties and values can be unknown...
}
}
function in_object($value,$object) {
if (is_object($object)) {
foreach($object as $key => $item) {
if ($value==$item) return $key;
}
}
return false;
}
function manipulate_property($value,$object) {
if ($property = in_object($value,$object)) {
// value found. I can now use this property.
// I can simply echo'it (makes no sense, as I could instead simply echo "value")
echo "<br />I found the property holding this value: ".$object->$property;
// or (here comes the good part)
// change the property
$object->$property = "This is a changed value!";
echo "<br />I changed the value to: ".$object->$property;
// or return it for use in my program flow
return $property;
} else {
echo "Value NOT FOUND!<br />";
return false;
}
}
// imagine if some function creates the class conditionally...
if (1 == 1) {
$class = new My_Class("property","Unchanged Value");
} else {
$class = new My_Class("property","Some Other Value");
}
// now let's check if the value we want exists, and if yes, let's have some fun with it...
$property = manipulate_property("Unchanged Value",$class);
if ($property) {
$my_variable = $class->$property;
echo "<br />This is my variable now:".$my_variable;
} else $my_variable = $some_other_variable;
?>
sólo ejecutarlo para ver por ti mismo!
¿Qué pasa si alguien está buscando el número '0' y espera obtener un valor booleano? – Matt
Esta es la solución más eficiente y correcta. Con algunas modificaciones, podría aplicarse para verificar cualquier tipo de datos presentes en cualquier objeto.
if(gettype($object->var1->var2) == "string"){
echo "Present";
}
- 1. ¿ArrayObject de PHP tiene un equivalente de in_array?
- 2. Un problema sobre in_array
- 3. in_array() no funciona
- 4. PHP in_array() siempre devuelve falso
- 5. in_array en objetos con referencias circulares
- 6. que es mejor array_search o in_array?
- 7. ¿In_array() usa un algoritmo de búsqueda binario?
- 8. ¿Cómo puedo usar in_array si la aguja es una matriz?
- 9. PHP in_array() rendimiento horrible. fatest manera de buscar matriz para
- 10. ¿Cómo in_array verifica si un objeto se encuentra en una matriz de objetos?
- 11. Equivalente equivalente al método Unity RegisterInstance
- 12. VMWare equivalente
- 13. IsFinite() equivalente
- 14. .NET equivalente de size_t
- 15. xml.etree.ElementTree equivalente en Java
- 16. Application.ProductName equivalente en WPF?
- 17. Yacc equivalente para Java
- 18. .NET JAXB equivalente?
- 19. C# ULONG_PTR Equivalente
- 20. Windows Equivalente a 'agradable'
- 21. xkill equivalente para Windows
- 22. Dreamweaver equivalente para Linux
- 23. Ruby "es" equivalente
- 24. Scala equivalente a wsdl2java?
- 25. Passport.js equivalente para Python?
- 26. Python equivalente de Sinatra
- 27. equivalente Método para @InjectMocks
- 28. C# equivalente a shell_exec
- 29. Lua equivalente de virtualenv?
- 30. Equivalente a 'este' puntero
¿Por qué necesita hacer esto? Los objetos no deben tratarse como matrices. – BoltClock
¿Qué hay sobre tratar con un objeto SimpleXML o simplemente un objeto de valores? ¿Cuál es la forma recomendada de ver si existe un valor dentro de un objeto? –