web-dev-qa-db-fra.com

in_array - équivalent 'in_object'?

Existe-t-il une fonction telle que in_array, mais pouvant être utilisée sur des objets?

21
davivid

Non, mais vous pouvez convertir l'objet en un tableau et le transmettre à in_array().

$obj = new stdClass;
$obj->one = 1;
var_dump(in_array(1, (array) $obj)); // bool(true)

Cela viole cependant toutes sortes de OOP principes. Voir mon commentaire sur votre question et La réponse d'Aron .

25
BoltClock

Tout d’abord, tableaux et objets sont tout à fait différents.

Un objet PHP ne peut pas être itéré par défaut, comme un tableau. Un moyen d'implémenter l'itération d'objet consiste à implémenter l'interface Iterator.

Concernant votre question spécifique, vous voudrez probablement jeter un coup d’œil sur l’interface ArrayAccess :

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

Vous pouvez maintenant accéder à votre objet comme un tableau de la manière suivante:

$object = new obj();
var_dump(isset($obj['two'])); // exists!
var_dump(isset($obj['foo'])); // does not exist

Avant que vous ne deveniez fou, réfléchissez bien pourquoi vous essayez réellement de le faire} et regardez les exemples sur php.net.

Option 2: lorsque vous essayez simplement de voir si une propriété existe, vous pouvez utiliser property_exists () pour cela:

class foo {
    public $bar = 'baz';
}

$object = new foo();
var_dump(property_exists($object, 'bar')); // true
14
Aron Rotteveel

Vous pouvez convertir l'objet en un tableau:

$obj = new stdClass();
$obj->var = 'foobar';
in_array( 'foobar', (array)$obj ); // true
7
Floern
function in_object($needle, $haystack) {
    return in_array($needle, get_object_vars($haystack));
}
5
powtac

C'est incroyable comment tout le monde passe à côté de l'utilité d'une méthode in_object PHP! Voici ce que j’ai trouvé, c’est très utile, et vous verrez pourquoi!

Voici une fonction simple que j'ai écrite et qui va vérifier si une valeur peut être trouvée dans un objet.

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

Ceci est très utile si un objet a été créé dynamiquement (surtout à partir de code externe que vous ne contrôlez pas, comme dans un plugin d'application, un CMS, etc.) et que vous ne connaissez pas les propriétés de l'objet. La fonction ci-dessus renverra la propriété, vous pourrez donc l'utiliser ultérieurement dans votre code.

Voici un très bon exemple de base de l’utilité de cette fonction!

<?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;
?>

Il suffit de l'exécuter pour voir par vous-même!

3
Chris Michaelides

Je ne le recommande pas, car c'est une très mauvaise pratique, mais vous pouvez utiliser get_object_vars .

Obtient les propriétés non statiques accessibles de l'objet donné en fonction de la portée.

Il y a d'autres limitations que vous devriez consulter dans la documentation pour voir si cela vous convient.

if(in_array('find me', get_object_vars($obj)))
3
xzyfer

C'est la solution la plus efficace et la plus correcte. Avec quelques modifications, il pourrait être appliqué pour vérifier tout type de données présent dans n'importe quel objet.

if(gettype($object->var1->var2) == "string"){
echo "Present";
}
0
iamnamrud