CMap
CMap implements a collection that takes key-value pairs.
You can access, add or remove an item with a key by using
itemAt,
add, and
remove. To get the number of the items in the map, use
getCount. CMap can also be used like a regular array as follows,
$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 Properties
Property |
Type |
Description |
Defined By |
count |
integer |
Returns the number of items in the map. |
CMap |
iterator |
CMapIterator |
Returns an iterator for traversing the items in the list. |
CMap |
keys |
array |
the key list |
CMap |
readOnly |
boolean |
whether this map is read-only or not. |
CMap |
Protected Methods
Method |
Description |
Defined By |
setReadOnly() |
Sets whether this list is read-only or not |
CMap |
Property Details
public integer getCount()
Returns the number of items in the map.
public CMapIterator getIterator()
Returns an iterator for traversing the items in the list. This method is required by the interface IteratorAggregate.
public array getKeys()
the key list
public boolean getReadOnly()
protected void setReadOnly(boolean $value)
whether this map is read-only or not. Defaults to false.
Method Details
public void __construct(array $data=NULL, boolean $readOnly=false)
|
$data |
array |
the initial data. Default is null, meaning no initialization. |
$readOnly |
boolean |
whether the list is read-only |
Constructor. Initializes the list with an array or an iterable object.
public void add(mixed $key, mixed $value)
|
$key |
mixed |
key |
$value |
mixed |
value |
Source Code: framework/collections/CMap.php#134 (
show)
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.'));
}
Adds an item into the map. Note, if the specified key already exists, the old value will be overwritten.
Removes all items in the map.
public boolean contains(mixed $key)
|
$key |
mixed |
the key |
{return} |
boolean |
whether the map contains an item with the specified key |
public void copyFrom(mixed $data)
|
$data |
mixed |
the data to be copied from, must be an array or object implementing Traversable |
Source Code: framework/collections/CMap.php#206 (
show)
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.'));
}
Copies iterable data into the map. Note, existing data in the map will be cleared first.
public integer count()
|
{return} |
integer |
number of items in the map. |
Returns the number of items in the map. This method is required by Countable interface.
public integer getCount()
|
{return} |
integer |
the number of items in the map |
Returns the number of items in the map.
Returns an iterator for traversing the items in the list. This method is required by the interface IteratorAggregate.
public array getKeys()
|
{return} |
array |
the key list |
public boolean getReadOnly()
|
{return} |
boolean |
whether this map is read-only or not. Defaults to false. |
public mixed itemAt(mixed $key)
|
$key |
mixed |
the key |
{return} |
mixed |
the element at the offset, null if no element is found at the offset |
Returns the item with the specified key. This method is exactly the same as offsetGet.
public static array mergeArray(array $a, array $b)
|
$a |
array |
array to be merged to |
$b |
array |
array to be merged from. You can specify additional arrays via third argument, fourth argument etc. |
{return} |
array |
the merged array (the original arrays are not changed.) |
Source Code: framework/collections/CMap.php#280 (
show)
public static function mergeArray($a,$b)
{
$args=func_get_args();
$res=array_shift($args);
while(!empty($args))
{
$next=array_shift($args);
foreach($next as $k => $v)
{
if(is_integer($k))
isset($res[$k]) ? $res[]=$v : $res[$k]=$v;
elseif(is_array($v) && isset($res[$k]) && is_array($res[$k]))
$res[$k]=self::mergeArray($res[$k],$v);
else
$res[$k]=$v;
}
}
return $res;
}
Merges two or more arrays into one recursively. If each array has an element with the same string key value, the latter will overwrite the former (different from array_merge_recursive). Recursive merging will be conducted if both arrays have an element of array type and are having the same key. For integer-keyed elements, the elements from the latter array will be appended to the former array.
public void mergeWith(mixed $data, boolean $recursive=true)
|
$data |
mixed |
the data to be merged with, must be an array or object implementing Traversable |
$recursive |
boolean |
whether the merging should be recursive. |
Source Code: framework/collections/CMap.php#238 (
show)
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.'));
}
Merges iterable data into the map.
Existing elements in the map will be overwritten if their keys are the same as those in the source. If the merge is recursive, the following algorithm is performed:
- the map data is saved as $a, and the source data is saved as $b;
- if $a and $b both have an array indexed at the same string key, the arrays will be merged using this algorithm;
- any integer-indexed elements in $b will be appended to $a and reindexed accordingly;
- any string-indexed elements in $b will overwrite elements in $a with the same index;
public boolean offsetExists(mixed $offset)
|
$offset |
mixed |
the offset to check on |
{return} |
boolean |
|
Returns whether there is an element at the specified offset. This method is required by the interface ArrayAccess.
public mixed offsetGet(integer $offset)
|
$offset |
integer |
the offset to retrieve element. |
{return} |
mixed |
the element at the offset, null if no element is found at the offset |
Returns the element at the specified offset. This method is required by the interface ArrayAccess.
public void offsetSet(integer $offset, mixed $item)
|
$offset |
integer |
the offset to set element |
$item |
mixed |
the element value |
Sets the element at the specified offset. This method is required by the interface ArrayAccess.
public void offsetUnset(mixed $offset)
|
$offset |
mixed |
the offset to unset element |
Unsets the element at the specified offset. This method is required by the interface ArrayAccess.
public mixed remove(mixed $key)
|
$key |
mixed |
the key of the item to be removed |
{return} |
mixed |
the removed value, null if no such key exists. |
Source Code: framework/collections/CMap.php#153 (
show)
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.'));
}
Removes an item from the map by its key.
protected void setReadOnly(boolean $value)
|
$value |
boolean |
whether this list is read-only or not |
public array toArray()
|
{return} |
array |
the list of items in array |