2011-02-18 14 views
16

¿Existe una función como in_array, pero se puede usar en objetos?in_array - 'in_object' equivalente?

+0

¿Por qué necesita hacer esto? Los objetos no deben tratarse como matrices. – BoltClock

+0

¿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? –

Respuesta

22

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.

6

Se puede convertir el objeto a una matriz:

$obj = new stdClass(); 
$obj->var = 'foobar'; 
in_array('foobar', (array)$obj); // true 
12

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 
2

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))) 
5
function in_object($needle, $haystack) { 
    return in_array($needle, get_object_vars($haystack)); 
} 
3

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!

+0

¿Qué pasa si alguien está buscando el número '0' y espera obtener un valor booleano? – Matt

0

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