@Tannenfels

Как передаётся переменная в цикл foreach?

Сравним два примера:
foreach($items as $value)

foreach($items as &$value)
Хотелось бы узнать - в обоих или только во втором случае $items будет передан по ссылке, а не по значению?
Это важно знать, поскольку в $items могут, например, быть большие массивы данных, содержащие выборки из БД. В таком случае обязательное использование реферренса поможет мне сэкономить память.
  • Вопрос задан
  • 361 просмотр
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Технически Pardon Me! Where Do I Find 4giveness?, прав, но в контексте вопроса есть нюанс.

В РНР используется механизм copy-on-write. То есть по умолчанию дублированная переменная является таки ссылкой на оригинал. И только если начать её изменять, она скопируется физически.

В данном случае это означает что если только перебирать значения, читая но не изменяя их, то фактически, по расходу памяти, это будет как будто передача по ссылке.
А вот если изменять значения массива - то тогда да, размер потребляемой памяти удвоится.

Вот я даже примерчик набросал для иллюстрации

Другое дело что если выборка из БД настолько большая, то просто не следует выгружать сразу массивом, а надо перебирать строки по одной, старым добрым fetch() в цикле. И не забыть использовать небуферизованный запрос. В этом случае, даже если мы в итоге будем собирать массив, памяти будет израсходовано под 1 массив, а не 2(3) (1 под результсет, 1 массив из БД и 1 - опционально - если мы изменяем исходный/генерим новый)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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