1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler 3*a1a3b679SAndreas Boehlernamespace Sabre\VObject; 4*a1a3b679SAndreas Boehler 5*a1a3b679SAndreas Boehler/** 6*a1a3b679SAndreas Boehler * VObject ElementList 7*a1a3b679SAndreas Boehler * 8*a1a3b679SAndreas Boehler * This class represents a list of elements. Lists are the result of queries, 9*a1a3b679SAndreas Boehler * such as doing $vcalendar->vevent where there's multiple VEVENT objects. 10*a1a3b679SAndreas Boehler * 11*a1a3b679SAndreas Boehler * @copyright Copyright (C) 2011-2015 fruux GmbH (https://fruux.com/). 12*a1a3b679SAndreas Boehler * @author Evert Pot (http://evertpot.com/) 13*a1a3b679SAndreas Boehler * @license http://sabre.io/license/ Modified BSD License 14*a1a3b679SAndreas Boehler */ 15*a1a3b679SAndreas Boehlerclass ElementList implements \Iterator, \Countable, \ArrayAccess { 16*a1a3b679SAndreas Boehler 17*a1a3b679SAndreas Boehler /** 18*a1a3b679SAndreas Boehler * Inner elements 19*a1a3b679SAndreas Boehler * 20*a1a3b679SAndreas Boehler * @var array 21*a1a3b679SAndreas Boehler */ 22*a1a3b679SAndreas Boehler protected $elements = array(); 23*a1a3b679SAndreas Boehler 24*a1a3b679SAndreas Boehler /** 25*a1a3b679SAndreas Boehler * Creates the element list. 26*a1a3b679SAndreas Boehler * 27*a1a3b679SAndreas Boehler * @param array $elements 28*a1a3b679SAndreas Boehler */ 29*a1a3b679SAndreas Boehler public function __construct(array $elements) { 30*a1a3b679SAndreas Boehler 31*a1a3b679SAndreas Boehler $this->elements = $elements; 32*a1a3b679SAndreas Boehler 33*a1a3b679SAndreas Boehler } 34*a1a3b679SAndreas Boehler 35*a1a3b679SAndreas Boehler /* {{{ Iterator interface */ 36*a1a3b679SAndreas Boehler 37*a1a3b679SAndreas Boehler /** 38*a1a3b679SAndreas Boehler * Current position 39*a1a3b679SAndreas Boehler * 40*a1a3b679SAndreas Boehler * @var int 41*a1a3b679SAndreas Boehler */ 42*a1a3b679SAndreas Boehler private $key = 0; 43*a1a3b679SAndreas Boehler 44*a1a3b679SAndreas Boehler /** 45*a1a3b679SAndreas Boehler * Returns current item in iteration 46*a1a3b679SAndreas Boehler * 47*a1a3b679SAndreas Boehler * @return Element 48*a1a3b679SAndreas Boehler */ 49*a1a3b679SAndreas Boehler public function current() { 50*a1a3b679SAndreas Boehler 51*a1a3b679SAndreas Boehler return $this->elements[$this->key]; 52*a1a3b679SAndreas Boehler 53*a1a3b679SAndreas Boehler } 54*a1a3b679SAndreas Boehler 55*a1a3b679SAndreas Boehler /** 56*a1a3b679SAndreas Boehler * To the next item in the iterator 57*a1a3b679SAndreas Boehler * 58*a1a3b679SAndreas Boehler * @return void 59*a1a3b679SAndreas Boehler */ 60*a1a3b679SAndreas Boehler public function next() { 61*a1a3b679SAndreas Boehler 62*a1a3b679SAndreas Boehler $this->key++; 63*a1a3b679SAndreas Boehler 64*a1a3b679SAndreas Boehler } 65*a1a3b679SAndreas Boehler 66*a1a3b679SAndreas Boehler /** 67*a1a3b679SAndreas Boehler * Returns the current iterator key 68*a1a3b679SAndreas Boehler * 69*a1a3b679SAndreas Boehler * @return int 70*a1a3b679SAndreas Boehler */ 71*a1a3b679SAndreas Boehler public function key() { 72*a1a3b679SAndreas Boehler 73*a1a3b679SAndreas Boehler return $this->key; 74*a1a3b679SAndreas Boehler 75*a1a3b679SAndreas Boehler } 76*a1a3b679SAndreas Boehler 77*a1a3b679SAndreas Boehler /** 78*a1a3b679SAndreas Boehler * Returns true if the current position in the iterator is a valid one 79*a1a3b679SAndreas Boehler * 80*a1a3b679SAndreas Boehler * @return bool 81*a1a3b679SAndreas Boehler */ 82*a1a3b679SAndreas Boehler public function valid() { 83*a1a3b679SAndreas Boehler 84*a1a3b679SAndreas Boehler return isset($this->elements[$this->key]); 85*a1a3b679SAndreas Boehler 86*a1a3b679SAndreas Boehler } 87*a1a3b679SAndreas Boehler 88*a1a3b679SAndreas Boehler /** 89*a1a3b679SAndreas Boehler * Rewinds the iterator 90*a1a3b679SAndreas Boehler * 91*a1a3b679SAndreas Boehler * @return void 92*a1a3b679SAndreas Boehler */ 93*a1a3b679SAndreas Boehler public function rewind() { 94*a1a3b679SAndreas Boehler 95*a1a3b679SAndreas Boehler $this->key = 0; 96*a1a3b679SAndreas Boehler 97*a1a3b679SAndreas Boehler } 98*a1a3b679SAndreas Boehler 99*a1a3b679SAndreas Boehler /* }}} */ 100*a1a3b679SAndreas Boehler 101*a1a3b679SAndreas Boehler /* {{{ Countable interface */ 102*a1a3b679SAndreas Boehler 103*a1a3b679SAndreas Boehler /** 104*a1a3b679SAndreas Boehler * Returns the number of elements 105*a1a3b679SAndreas Boehler * 106*a1a3b679SAndreas Boehler * @return int 107*a1a3b679SAndreas Boehler */ 108*a1a3b679SAndreas Boehler public function count() { 109*a1a3b679SAndreas Boehler 110*a1a3b679SAndreas Boehler return count($this->elements); 111*a1a3b679SAndreas Boehler 112*a1a3b679SAndreas Boehler } 113*a1a3b679SAndreas Boehler 114*a1a3b679SAndreas Boehler /* }}} */ 115*a1a3b679SAndreas Boehler 116*a1a3b679SAndreas Boehler /* {{{ ArrayAccess Interface */ 117*a1a3b679SAndreas Boehler 118*a1a3b679SAndreas Boehler 119*a1a3b679SAndreas Boehler /** 120*a1a3b679SAndreas Boehler * Checks if an item exists through ArrayAccess. 121*a1a3b679SAndreas Boehler * 122*a1a3b679SAndreas Boehler * @param int $offset 123*a1a3b679SAndreas Boehler * @return bool 124*a1a3b679SAndreas Boehler */ 125*a1a3b679SAndreas Boehler public function offsetExists($offset) { 126*a1a3b679SAndreas Boehler 127*a1a3b679SAndreas Boehler return isset($this->elements[$offset]); 128*a1a3b679SAndreas Boehler 129*a1a3b679SAndreas Boehler } 130*a1a3b679SAndreas Boehler 131*a1a3b679SAndreas Boehler /** 132*a1a3b679SAndreas Boehler * Gets an item through ArrayAccess. 133*a1a3b679SAndreas Boehler * 134*a1a3b679SAndreas Boehler * @param int $offset 135*a1a3b679SAndreas Boehler * @return mixed 136*a1a3b679SAndreas Boehler */ 137*a1a3b679SAndreas Boehler public function offsetGet($offset) { 138*a1a3b679SAndreas Boehler 139*a1a3b679SAndreas Boehler return $this->elements[$offset]; 140*a1a3b679SAndreas Boehler 141*a1a3b679SAndreas Boehler } 142*a1a3b679SAndreas Boehler 143*a1a3b679SAndreas Boehler /** 144*a1a3b679SAndreas Boehler * Sets an item through ArrayAccess. 145*a1a3b679SAndreas Boehler * 146*a1a3b679SAndreas Boehler * @param int $offset 147*a1a3b679SAndreas Boehler * @param mixed $value 148*a1a3b679SAndreas Boehler * @return void 149*a1a3b679SAndreas Boehler */ 150*a1a3b679SAndreas Boehler public function offsetSet($offset, $value) { 151*a1a3b679SAndreas Boehler 152*a1a3b679SAndreas Boehler throw new \LogicException('You can not add new objects to an ElementList'); 153*a1a3b679SAndreas Boehler 154*a1a3b679SAndreas Boehler } 155*a1a3b679SAndreas Boehler 156*a1a3b679SAndreas Boehler /** 157*a1a3b679SAndreas Boehler * Sets an item through ArrayAccess. 158*a1a3b679SAndreas Boehler * 159*a1a3b679SAndreas Boehler * This method just forwards the request to the inner iterator 160*a1a3b679SAndreas Boehler * 161*a1a3b679SAndreas Boehler * @param int $offset 162*a1a3b679SAndreas Boehler * @return void 163*a1a3b679SAndreas Boehler */ 164*a1a3b679SAndreas Boehler public function offsetUnset($offset) { 165*a1a3b679SAndreas Boehler 166*a1a3b679SAndreas Boehler throw new \LogicException('You can not remove objects from an ElementList'); 167*a1a3b679SAndreas Boehler 168*a1a3b679SAndreas Boehler } 169*a1a3b679SAndreas Boehler 170*a1a3b679SAndreas Boehler /* }}} */ 171*a1a3b679SAndreas Boehler 172*a1a3b679SAndreas Boehler} 173