<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=227405&amp;view=findpost&amp;p=1896578</guid>
        <pubDate>Wed, 12 Mar 2008 06:34:39 +0000</pubDate>
        <title>Объектная обертка для массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=227405&amp;view=findpost&amp;p=1896578</link>
        <description><![CDATA[Axis: Объектная обертка для массива<br>
<br>
Необходима критика, пожелания и все в этом духе. Если кому понадобится, используйте на здоровье.<br>
Возможны изменения.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">/**</div><div class="code_line">&nbsp;* Объектная обертка для массива</div><div class="code_line">&nbsp;* @author Axis</div><div class="code_line">&nbsp;* @category Proxy</div><div class="code_line">&nbsp;*/</div><div class="code_line">class AxArrayAcces implements ArrayAccess, Countable, Iterator</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;protected $data = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp;protected $parent = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp;protected $index = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp;protected $changed = false;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/**</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Конструктор, возможна предварительная инициализация массивом</div><div class="code_line">&nbsp;&nbsp; &nbsp; * @param array данные</div><div class="code_line">&nbsp;&nbsp; &nbsp; * @param AxArrayAcces родитель (для внутренних нужд)</div><div class="code_line">&nbsp;&nbsp; &nbsp; * @param mixed индекс текущего среза (для внутренних нужд)</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;public function __construct($data = null, $parent = null, $index = null)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if($index !== null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&#62;index = $index;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if($parent !== null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&#62;parent = $parent;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if($data !== null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&#62;data =&amp; $data;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if($data === null &amp;&amp; $parent === null &amp;&amp; $index === null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&#62;data = array();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/**</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Создание массива, используется при установке значения на несуществующем срезе</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;protected function createArray($index = null)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if($this-&#62;parent !== null &amp;&amp; $this-&#62;index !== null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&#62;data === null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&#62;parent-&#62;createArray($this-&#62;index);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&#62;parent-&#62;data !== null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&#62;data =&amp; $this-&#62;parent-&#62;data[$this-&#62;index];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if($index !== null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&#62;data[$index] = array();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/**</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Установка флага изменение ветки</div><div class="code_line">&nbsp;&nbsp; &nbsp; * @param bool флаг</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;protected function SetChanged($val = true)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if($this-&#62;parent !== null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&#62;parent-&#62;SetChanged($val);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&#62;changed = $val;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/**</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Флаг измененности ветки</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;public function IsChanged()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if($this-&#62;parent === null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return $this-&#62;changed;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return $this-&#62;parent-&#62;IsParent();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/**</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Копия данных среза</div><div class="code_line">&nbsp;&nbsp; &nbsp; * @return mixed данные</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;public function Value()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return $this-&#62;data;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/**</div><div class="code_line">&nbsp;&nbsp; &nbsp; * Данные среза по ссылке</div><div class="code_line">&nbsp;&nbsp; &nbsp; * @return reference данные</div><div class="code_line">&nbsp;&nbsp; &nbsp; */</div><div class="code_line">&nbsp;&nbsp; &nbsp;public function &amp;ValueByRef()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return $this-&#62;data;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public function __toString()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return (string)$this-&#62;data;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Iterator</div><div class="code_line">&nbsp;&nbsp; &nbsp;private $position = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public function current ()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if($this-&#62;data !== null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{echo &#39;c&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(is_array($this-&#62;data[key($this-&#62;data)]))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return new AxArrayAcces(&amp;$this-&#62;data[key($this-&#62;data)], $this, key($this-&#62;data));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return current($this-&#62;data);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return null; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public function key () </div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if($this-&#62;data !== null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return key($this-&#62;data);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return null; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public function next () </div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if($this-&#62;data !== null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return next($this-&#62;data) !== false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return null; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public function rewind () </div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if($this-&#62;data !== null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return reset($this-&#62;data);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return null;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public function valid () </div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if($this-&#62;data !== null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return current($this-&#62;data) !== false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return null; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Countable</div><div class="code_line">&nbsp;&nbsp; &nbsp;public function count()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if($this-&#62;data === null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return sizeof($this-&#62;data);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// ArrayAccess</div><div class="code_line">&nbsp;&nbsp; &nbsp;public function offsetExists($offset)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if($this-&#62;data === null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return isset($this-&#62;data[$offset]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public function offsetGet($offset)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if($this-&#62;data === null || !isset($this-&#62;data[$offset]))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return new AxArrayAcces(null, $this, $offset);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if(is_array($this-&#62;data[$offset]))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return new AxArrayAcces(&amp;$this-&#62;data[$offset], $this, $offset);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return $this-&#62;data[$offset];</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public function offsetSet($offset, $value)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if($this-&#62;data === null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&#62;createArray();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$this-&#62;SetChanged();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$this-&#62;data[$offset] = $value;</div><div class="code_line">&nbsp;&nbsp; &nbsp;} </div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public function offsetUnset($offset)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;unset($this-&#62;data[$offset]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Axis</author>
        <category>PHP</category>
      </item>
	
      </channel>
      </rss>
	