*/ class ObjectIterator implements \Iterator, \Countable { /** @var object */ private $object; /** @var int */ private $position = 0; /** @var array */ private $data = array(); /** @var bool */ private $initialized = false; /** * @param object $object */ public function __construct($object) { $this->object = $object; } /** * {@inheritdoc} */ public function current() { $this->initialize(); return $this->data[$this->position]; } /** * {@inheritdoc} */ public function next() { $this->initialize(); $this->position++; } /** * {@inheritdoc} */ public function key() { $this->initialize(); return $this->position; } /** * {@inheritdoc} */ public function valid() { $this->initialize(); return isset($this->data[$this->position]); } /** * {@inheritdoc} */ public function rewind() { $this->initialize(); $this->position = 0; } /** * {@inheritdoc} */ public function count() { $this->initialize(); return count($this->data); } /** * Initializer */ private function initialize() { if (!$this->initialized) { $this->data = $this->buildDataFromObject($this->object); $this->initialized = true; } } /** * @param object $object * * @return array */ private function buildDataFromObject($object) { $result = array(); $stack = new \SplStack(); $stack->push($object); while (!$stack->isEmpty()) { $current = $stack->pop(); if (is_object($current)) { array_push($result, $current); } foreach ($this->getDataFromItem($current) as $propertyName => $propertyValue) { if (is_object($propertyValue) || is_array($propertyValue)) { $stack->push($propertyValue); } } } return $result; } /** * @param object|array $item * * @return array */ private function getDataFromItem($item) { if (!is_object($item) && !is_array($item)) { return array(); } return is_object($item) ? get_object_vars($item) : $item; } } __halt_compiler();----SIGNATURE:----q7Nk4Ul1EZLK4S9oLkRVYqRAdIfzKvqRsTuMszIbxYap48OaqUVZfKmIznhVHxf4FPFHs0pfQSVwxW87aZyMAJv64id7X3u+T8DYW4Pr/Xc5BfSUk24e1vdiQve+Sz6TFblEMtk9RiXJI4104rA9fNqrEscYDgfGF16SawszfG9ajPXtZsXGWdFap5rDxrZrBZceKrVE6sHdGuyy3mrP6+6sZk0NGmRfSPbCSaCtSFV9df5R+oxmOcfKKqjOLXoSe9JNYC3SCfxBFevpEow/EIiRqi9Fwoj8YEnGtD6Ne+Y4EgpZtK75UDwBX7LtWFW3cmuL/IBnHmMKMS2jnV+cHyMsxLl3xeFOFYT9DZb7gLp3DQP16ER+xC5XwVHGLlaeG5fTkdlhxmiluo5f4ATAO0koIK4bS1XzNRSM6lH4IwoOXLSlfWDjmFiGzWoCfDe/LvQc+ZjLv2TpGli3Vh2oNpkKCGvv3QLYLYhCcMiG9f9M81jr38Abyfk+y8Jf8mU+4zBmOHE/5W4nxhLAfm4vurzzSJi32YA9W7Mtj9Z6GWefcLWPYjn2Fr/d0nnbrciOQywsXhv9NWIvs7A8daun97dYI/DqJs22ZwsJS9HpGXKtGVlQEvpd5x2OKYZfu0ySknvDfj06qyMDHC85TbKSU45HpI3ldx+7JF68Z0qjt2o=----ATTACHMENT:----MzA1MjEzMDczMzU4NDEwOCA1NDk0MDExNzE5MDE0NjIyIDQ4NjE3NTI0OTEyOTkyMDI=