сегодня лень толкнула на близкое изучение 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()
|