iterator_to_array

Я нахожу его самым полезным в цепочках действий, которые часто включают обнаружение ошибок, и т.д.

if ((rc = first_check(arg1, arg2)) != 0)
{
    report error based on rc
}
else if ((rc = second_check(arg2, arg3)) != 0)
{
    report error based on new rc
}
else if ((rc = third_check(arg3, arg4)) != 0)
{
    report error based on new rc
}
else
{
    do what you really wanted to do
}

, альтернатива (не использование присвоения в условии):

rc = first_check(arg1, arg2);
if (rc != 0)
{
    report error based on rc
}
else
{
    rc = second_check(arg2, arg3);
    if (rc != 0)
    {
        report error based on new rc
    }
    else
    {
        rc = third_check(arg3, arg4);
        if (rc != 0)
        {
            report error based on new rc
        }
        else
        {
            do what you really wanted to do
        }
    }
}

С длительной проверкой ошибок, альтернатива может убежать RHS страницы, тогда как версия присвоения в условном выражении не делает этого.

проверки на ошибки могли также быть 'действиями' — first_action(), second_action(), third_action() —, конечно, а не просто проверяют. Таким образом, они могли быть проверены шаги в процессе, которым справляется функция. (Чаще всего в коде я работаю с, функции вроде проверок предварительного условия или выделений памяти, необходимых для функции для работы, или вдоль подобных строк).

7
задан Ionuț G. Stan 15 September 2009 в 13:47
поделиться

3 ответа

Вот что я бы сделал. Я бы расширил DatePeriod и реализовал метод toArray :

class MyDatePeriod extends DatePeriod
{
    public $dates;

    public function toArray()
    {
        if ($this->dates === null) {
            $this->dates = iterator_to_array($this);
        }

        return $this->dates;
    }
}

$p = new MyDatePeriod(date_create('2008-01-01'),
                      DateInterval::createFromDateString( "+2 days" ),
                      date_create('2008-12-31'));

echo count($p->toArray()) . "\n"; // 183

echo count($p->toArray()) . "\n"; // 183
3
ответ дан 7 December 2019 в 05:25
поделиться

Интересно, может быть, итератор не запускается повторно с помощью iterator_to_array (), поэтому второй вызов начинает повторение с курсор в конце. Вы можете попробовать следующее:

$p->rewind()
$a=iterator_to_array($p); 

Если итератор не может быть перемотан, вы можете попробовать клонировать объект перед его обходом, например

$p2 = clone $p;
echo count(iterator_to_array($p2));

$array = iterator_to_array($p);
3
ответ дан 7 December 2019 в 05:25
поделиться

Предположительно, первый вызов проходит все элементы в итераторе (т.е. вызывает next (), пока valid () не станет ложным). Разумным поведением является начало преобразования iterator_to_array с текущей позиции в итераторе - бесшумная перемотка перемотки будет негибкой и, возможно, вызовет ошибку.

Попробуйте перемотать итератор, прежде чем использовать его снова.

$p=new DatePeriod(date_create('2008-01-01'),
                  DateInterval::createFromDateString( "+2 days" ),
                  date_create('2008-12-31')); 

echo count(iterator_to_array($p)); //183 

$p->rewind(); // Newly added!

$a=iterator_to_array($p); 
echo count($a); //0
2
ответ дан 7 December 2019 в 05:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: