CMap реализует коллекцию, которая принимает пары ключ-значение.
Вы можете получить доступ к элементу, добавить или удалить элемент по ключу, используя itemAt, add и remove. Чтобы получить количество элементов в массиве, используйте getCount. CMap также может использоваться как обычный массив следующим образом,
$map[$key]=$value; // add a key-value pair
unset($map[$key]); // remove the value with the specified key
if(isset($map[$key])) // if the map contains the key
foreach($map as $key=>$value) // traverse the items in the map
$n=count($map); // returns the number of items in the map
public function add($key,$value) { if(!$this->_r) { if($key===null) $this->_d[]=$value; else $this->_d[$key]=$value; } else throw new CException(Yii::t('yii','The map is read only.')); }
Добавляет элемент в карту. Обратите внимание, что если указанный ключ уже существует, старое значение будет перезаписано.
public function copyFrom($data) { if(is_array($data) || $data instanceof Traversable) { if($this->getCount()>0) $this->clear(); if($data instanceof CMap) $data=$data->_d; foreach($data as $key=>$value) $this->add($key,$value); } elseif($data!==null) throw new CException(Yii::t('yii','Map data must be an array or an object implementing Traversable.')); }
Копирует итерируемые данные в карту. Обратите внимание, что существующие данные в карте сначала будут очищены.
Рекурсивно объединяет два или более массивов в один. Если в каждом массиве есть элемент с одинаковым строковым значением ключа, последнее значение перекроет предыдущее (отличается от array_merge_recursive). Рекурсивное слияние будет выполнено, если оба массива содержат элемент типа массив и имеют одинаковый ключ. Для элементов с целочисленными ключами элементы из последнего массива будут добавлены к первому массиву.
public function mergeWith($data,$recursive=true) { if(is_array($data) || $data instanceof Traversable) { if($data instanceof CMap) $data=$data->_d; if($recursive) { if($data instanceof Traversable) { $d=array(); foreach($data as $key=>$value) $d[$key]=$value; $this->_d=self::mergeArray($this->_d,$d); } else $this->_d=self::mergeArray($this->_d,$data); } else { foreach($data as $key=>$value) $this->add($key,$value); } } elseif($data!==null) throw new CException(Yii::t('yii','Map data must be an array or an object implementing Traversable.')); }
Объединяет данные, полученные от итерируемого источника, в карту.
Существующие элементы в карте будут перезаписаны, если их ключи совпадают с ключами в источнике. Если слияние рекурсивное, выполняется следующий алгоритм:
данные карты сохраняются как $a, а данные источника как $b;
если $a и $b оба имеют массив по одинаковому строковому ключу, массивы будут объединены с помощью этого алгоритма;
все целочисленные индексы элементов в $b будут добавлены к $a и переиндексированы соответственно;
все строковые индексы элементов в $b перезапишут элементы в $a с одинаковым индексом;
public function remove($key) { if(!$this->_r) { if(isset($this->_d[$key])) { $value=$this->_d[$key]; unset($this->_d[$key]); return $value; } else { // it is possible the value is null, which is not detected by isset unset($this->_d[$key]); return null; } } else throw new CException(Yii::t('yii','The map is read only.')); }