ArrayIterator::append
(PHP 5 >= 5.0.0)
ArrayIterator::append — Append an element
Description
Appends value as the last element.
Warning
This function is currently not documented; only its argument list is available.
Parameters
-
value
-
The value to append.
Return Values
No value is returned.
Notes
Note:
This method cannot be called when the ArrayIterator refers to an object.
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Другие базовые расширения
- Стандартная библиотека PHP (SPL)
- Итераторы
- Функция ArrayIterator::append() - Добавить элемент
- Функция ArrayIterator::asort() - Сортирует массив по значениям
- Функция ArrayIterator::__construct() - Создает ArrayIterator
- Функция ArrayIterator::count() - Посчитать количество элементов
- Функция ArrayIterator::current() - Возвращает текущий элемент в массиве
- Функция ArrayIterator::getArrayCopy() - Возвращает копию массива
- Функция ArrayIterator::getFlags() - Получает флаги
- Функция ArrayIterator::key() - Возвращает ключ текущего элемента массива
- Функция ArrayIterator::ksort() - Сортирует массив по ключам
- Функция ArrayIterator::natcasesort() - Сортирует массив "натурально", с учетом регистра
- Функция ArrayIterator::natsort() - Сортирует массив "натурально"
- Функция ArrayIterator::next() - Перемещает указатель за следующую запись
- Функция ArrayIterator::offsetExists() - Проверяет существует ли смещение
- Функция ArrayIterator::offsetGet() - Получает значение для смещения
- Функция ArrayIterator::offsetSet() - Устанавливает значение для смещения
- Функция ArrayIterator::offsetUnset() - Сбрасывает значение по смещению
- Функция ArrayIterator::rewind() - Перемещает указатель в начало массива
- Функция ArrayIterator::seek() - Перещает указатель на выбранную позицию
- Функция ArrayIterator::serialize() - Сериализует массив
- Функция ArrayIterator::setFlags() - Устанавливает флаги, управляющие поведением
- Функция ArrayIterator::uasort() - Сортировка, определенная пользователем
- Функция ArrayIterator::uksort() - Сортировка, определенная пользователем
- Функция ArrayIterator::unserialize() - Десериализация
- Функция ArrayIterator::valid() - Проверяет, содержит ли массив еще записи
Коментарии
we can append values after the given array,the index is begin from 0, for example:
<?php
$b = array('name'=>'mengzhi','age'=>'22','city'=>'shanghai');
$a = new ArrayIterator($b);
$a->append(array('home'=>'china','work'=>'developer'));
var_dump($a);
?>
then output:
object(ArrayIterator)#1 (1) { ["storage":"ArrayIterator":private]=> array(4) { ["name"]=> string(7) "mengzhi" ["age"]=> string(2) "12" ["city"]=> string(8) "shanghai" [0]=> array(2) { ["home"]=> string(5) "china" ["work"]=> string(9) "developer" } } }
As ArrayIterator is not a real list the implementation of "append" is a little bit confusing me. When using "append" I expected the new value at the postion "last element index + 1". This will not happen when you unset elements before.
It seems like indexes once they're used are blacklisted end never used again, even if they're unset.
Like suggested in http://www.php.net/manual/de/arrayiterator.offsetset.php#106775 ArrayIterator::append uses ArrayIterator::offsetSet with empty index parameter. So I've this two workarounds to get "append" to work like I want:
<?php
class myArrayIterator extends ArrayIterator {
public function offsetSet($offset, $value) {
if (is_null($offset)) { // offset == null when it's called by ArrayIterator::append
$offset = $this->generateOffset(); // do it in a separate method
}
parent::offsetSet($offset, $value); // call the native implementation with an index
$this->ksort(); // sort it to avoid confusion when it gets dumped or iterated
}
protected function generateOffset() {
$offset = count($this); // take count as offset as it should be lastKey+1
while ($this->offsetExists($offset)) { // is it really empty?
$offset++; // try the next one until there's an empty one
}
return $offset;
}
}
class mySaveArrayIterator extends myArrayIterator {
protected function generateOffset() {
$offset = 0; // expect zero is the first possible key
while ($this->offsetExists($offset)) { // try every key until there's an empty one
$offset++;
}
return $offset;
}
}
$data = array('foo', 'bar', 'baz');
$array = new ArrayIterator($data);
$myArray = new myArrayIterator($data);
$mySaveArray = new mySaveArrayIterator($data);
// remove the last element
$array ->offsetUnset(2);
$myArray ->offsetUnset(2);
$mySaveArray->offsetUnset(2);
// append an element
$array ->append('foobar');
$myArray ->append('foobar');
$mySaveArray->append('foobar');
// check the position of the new element
print_r($array);
print_r($myArray);
print_r($mySaveArray);
// remove some element
$array ->offsetUnset(1);
$myArray ->offsetUnset(1);
$mySaveArray->offsetUnset(1);
// again append an element
$array ->append('foobarbaz');
$myArray ->append('foobarbaz');
$mySaveArray->append('foobarbaz');
// check the position of the new element
print_r($array);
print_r($myArray);
print_r($mySaveArray);
?>
Output:
ArrayIterator Object
(
[storage:ArrayIterator:private] => Array
(
[0] => foo
[1] => bar
[3] => foobar
)
)
myArrayIterator Object
(
[storage:ArrayIterator:private] => Array
(
[0] => foo
[1] => bar
[2] => foobar
)
)
mySaveArrayIterator Object
(
[storage:ArrayIterator:private] => Array
(
[0] => foo
[1] => bar
[2] => foobar
)
)
ArrayIterator Object
(
[storage:ArrayIterator:private] => Array
(
[0] => foo
[3] => foobar
[4] => foobarbaz
)
)
myArrayIterator Object
(
[storage:ArrayIterator:private] => Array
(
[0] => foo
[2] => foobar
[3] => foobarbaz
)
)
mySaveArrayIterator Object
(
[storage:ArrayIterator:private] => Array
(
[0] => foo
[1] => foobarbaz
[2] => foobar
)
)
This helped me to treat the ArrayIterator as a list with valid indexes in a serial manner.