сегодня лень толкнула на близкое изучение
AppendIterator
предисловие (Отобразить)
для автоматизации формирования селекта есть у меня метод
PHP:
скопировать код в буфер обмена
CHtmlElements::select($name, $optionList, $selectedValue='' ,$id='', $class='', $css='', $required=false, $multiple=false);
где $optionList обычно ассоциативный массив, и вот в очередной раз готовя список лень шелохнулась, так как исходный список поставщиков получался из итератора объектов поставщиков,
и нужно было в первый элемент добавить элемент "Все"
так вот при первом ознакомлении с этим классом кидается в глаза неудобство:
PHP:
скопировать код в буфер обмена
$pizzas = new ArrayIterator
(array('Margarita', 'Siciliana', 'Hawaii')); $toppings = new ArrayIterator
(array('Cheese', 'Anchovies', 'Olives', 'Pineapple', 'Ham')); $appendIterator = new AppendIterator;
$appendIterator->append($pizzas);
$appendIterator->append($toppings);
получается что б смержить с массивом, нужно каждый раз оборачивать массив в ArrayIterator, фиг бы с ним, но для этого каждый раз писать $appendIterator->append($pizzas); громоздко
выходом становится обернуть создание итератора и мерж в метода:
Спойлер (Отобразить)PHP:
скопировать код в буфер обмена
class LArray{
/**
* сливает массивы и итераторы в единый итератор
* @param {array|iterator} $itr
* @param [..]
*/
static
public function merge
($itr=array()){ $itr = new AppendIterator;
$itr->append(new ArrayIterator($item));
}
elseif($item instanceof Iterator){
$itr->append($item);
}
}
}
return $itr;
}
}
p.s. недостатком является тот факт, что в данном случае все объекты в итераторе должны поддерживать метод __toString()