in_array – эквивалент 'in_object'?

Есть ли такая функция, как in_array , но может использоваться на объектах?

Related of "in_array – эквивалент 'in_object'?"

Нет, но вы можете передать объект в массив и передать его в in_array() .

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

Тем не менее это нарушает все виды принципов ООП. См. Мой комментарий к вашему вопросу и ответ Арона .

Прежде всего, массивы и объекты совершенно разные.

По умолчанию объект PHP не может быть повторен как массив. Способ реализации итерации объектов – реализовать интерфейс Iterator.

Что касается вашего конкретного вопроса, вы, вероятно, хотите взглянуть на интерфейс 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; } } с 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; } } 

Теперь вы можете получить доступ к вашему объекту, как массив, следующим образом:

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

Прежде чем сходить с ума, пожалуйста, подумайте, почему вы на самом деле пытаетесь это сделать и посмотрите на примеры на php.net.

Вариант 2: когда вы просто пытаетесь увидеть, существует ли свойство , вы можете использовать свойство_exists () для этого:

 class foo { public $bar = 'baz'; } $object = new foo(); var_dump(property_exists($object, 'bar')); // true 

Вы можете применить объект к массиву:

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

Невероятно, как все люди упускают смысл полезности метода in_object PHP! Вот что я придумал, это очень полезно, и вы поймете, почему!

Вот простую функцию, которую я написал, которая проверит, можно ли найти значение внутри объекта.

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

Это очень полезно, если объект был создан динамически (особенно из внешнего кода, который вы не контролируете, как в приложении-плагине, CMS и т. Д.), И вы не знаете свойств объекта. Вышеупомянутая функция вернет свойство, поэтому вы сможете использовать его в своем коде позже.

Вот очень хороший базовый пример того, насколько полезной эта функция!

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

Просто запустите его, чтобы убедиться сами!

Я не рекомендую это, потому что это очень плохая практика, но вы можете использовать get_object_vars .

Получает доступные нестатические свойства данного объекта в соответствии с областью действия.

Существуют и другие ограничения, которые вы должны сослаться на документацию, чтобы узнать, подходит ли она вам.

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

Это наиболее эффективное и правильное решение. С некоторыми изменениями он может применяться для проверки любого типа данных, присутствующего в любом объекте.

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