Задать вопрос
ragnar_ok
@ragnar_ok

Когда полезно использовать генератор, если объем данных небольшой?

Если нужно несколько раз итерировать один и тот же массив, то будет ли эффективнее использовать генератор, чем foreach? А если передавать массив в функцию по ссылке?

Подготовил пример. Теоретический.

spoiler
/**
 * @param string[] $array
 */
function setFoo(array &$array): void
{
    foreach ($array as &$item) {
        if ($item === 'foo') {
            $item = 'baz';
        }
    }
}

/**
 * @param string[] $array
 */
function setBar(array &$array): void
{
    foreach ($array as &$item) {
        if ($item === 'bar') {
            $item = null;
        }
    }
}

$array = [
    'foo',
    'bar',
];

setFoo($array);
setBar($array);


sandbox.onlinephpfunctions.com/code/cab17cc19053f0...
  • Вопрос задан
  • 157 просмотров
Подписаться 2 Простой 10 комментариев
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Эффективность здесь вообще не при чем.
Генератор - это синтаксический сахар
То есть вопрос вообще не про эффективность

вот ей-богу, какая-то болезнь что ли.
у вас любая функция оценивается только по одному признаку - "эффективность"! Какая быстрее - такая и лучше.
всё, других критериев нет. и наоборот - если кто-то где-то насвистел что одна функция "эффективнее" другой - то всё, везде используется только эта, вопреки логике и здравому смыслу. потому что эффективнее же!

Но на самом деле бывают и другие критерии.
У генератора есть одно однозначно полезное применение - возможность создания унифицированных интерфейсов.
Любой потоковый источник он может превратить в перебираемый.
То есть можно наплодить интерфейсов и скармливать их какому-нибудь форичу, и он будет с ними работать, не зная, поток внутри, или массив. Файл, результат запроса из БД, раскодированный джейсон - если в каждого из этих источников будет перебираемый интерфейс, то все их можно будет перебирать в одном и том же цикле.
И вот ради такой унификации и используется генератор
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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