php: полиморфизм на реализацию итератора объекта массива? - PullRequest
2 голосов
/ 05 января 2010

Я не знаю, является ли массив объектом php ... но я хочу изменить поведение массива в цикле foreach.

Что-то похожее на это на Java:

for( String it : myArr = new Array_Iterator( array) implements Iterator{
    public Array_Iterator( String[] arr){ this.arr = arr}
    /* interface implementation */
}){
    /* loop */
}

Что я действительно хочу сделать, так это своего рода фильтр, так что я не получаю записи из массива, который мне не нужен

Ответы [ 3 ]

3 голосов
/ 05 января 2010

Вы, вероятно, ищете функцию PHP array_filter .

Итерация по каждому значению на входе массив, передавая их обратному вызову функция. Если функция обратного вызова возвращает true, текущее значение из вход возвращается в результат массив. Ключи массива сохранены.

Если вам нравится подход на основе итераторов, вы также можете взглянуть на Стандартную библиотеку PHP (SPL) , в частности ArrayIterator в сочетании с FilterIterator .

2 голосов
/ 05 января 2010

Просто поместите массив в ArrayIterator , и вы сможете переписать обычные методы. Spl предоставляет ряд других Итераторов и Интерфейсы , которые могут оказаться полезными. Чтобы фильтровать массивы через итераторы, используйте команду FilterIterator .

.

Пример из руководства по PHP:

<?php
// This iterator filters all values with less than 10 characters
class LengthFilterIterator extends FilterIterator {
    public function accept() {
        // Only accept strings with a length of 10 and greater
        return strlen(parent::current()) > 10;
    }
}

$arrayIterator = new ArrayIterator(array('test1', 'more than 10 characters'));
$lengthFilter = new LengthFilterIterator($arrayIterator);

foreach ($lengthFilter as $value) {
    echo $value . "\n"; // ignores "test1" in array
}
1 голос
/ 05 января 2010

Если вам нужен фильтр для элементов массива, попробуйте array_filter . Сделайте функцию, которая возвращает true, если элемент должен быть сохранен, или false, если он не должен быть сохранен, затем передайте его array_filter.

...