Прошу объяснить работу цикла while

164
21 февраля 2019, 11:00

Конструкцию

foreach ($data as $k => $val) 

я проговариваю себе в уме так:

"перебрать весь массив $data и вывести его ключи в $k, а их значения в $v".

Также мне понятно с for. Но я не могу "проговорить сам для себя" конструкцию

while ($l = mysqli_fetch_assoc($r)) 

Это как я должен понимать:

"пока $l равна результату преобразования объекта $r в ассоциативный массив?"

Но это же бред. Независимо от результата преобразования $l в данном условие будет равна этому результату.

Прошу объяснить это строку. Спасибо.

Answer 1

пока $l равна результату

Не равна результату, а присваивается результат. Если хотите, то можно сказать так: пока присвоенный результат не равен false - продолжать выполнять цикл. Если на ассоциативном уровне, то можете представить операцию присваивания ассоциативного массива строк с тем, как вы черпаете кружкой ($l) воду из ведра (mysqli_fetch_assoc). Если в кружке после очередного зачерпывания (итерации) есть вода (true), можно продолжать набирать, но когда вода в ведре закончится - в кружке будет пусто (false) и столь интересное занятие нужно прекращать.

Answer 2

Просто не надо читать весь while целиком:

while ($l = mysqli_fetch_assoc($r))

Вместо этого читайте его только для результата присвоения:

while ($l

А именно - "пока $l есть true или приводится к true, выполнять..."

Аналогичная проблема у вас могла возникнуть и с чтением условий. Например, популярный способ проверки наличия кэша и его создания в случае отсутствия:

if (!($data = cache::get($key))) {
    $data = Src::get();
    cache::set($key, $data);
}

Интерпретатор первым делом выполнит cache::get($key), только потом присвоит результат в переменную $data = .. и только потом приведёт значение переменной к boolean (для этого и нужны скобки вокруг присвоения) !($data ...

Просто следуйте тем же путём, что и пыха. В условии и в цикле проверяется нечто в круглых скобках. В вашем случае это присвоение. И тут важно обратиться к документации:

здесь присутствует и еще одно значение - значение самого присвоения. Само присвоение вычисляется в присвоенное значение

(C) Выражения

Т.е. символ присвоения - = - есть выражение и его результат - то, что справа от =. Но удобнее смотреть на левую часть, а там у вас переменная. Результат присвоения в ней и рассуждать можно уже представляя что вы видите только эту переменную и ничего справа от неё.

Отдельно можете ещё попробовать переписать цикл на do..while. Станет сложнее читать сам код, но будет понятнее как производится присвоение и проверка выхода из цикла.

READ ALSO
Подключение стилей в модуле Yii2

Подключение стилей в модуле Yii2

Создал модуль и для него отдельный AppAsset, подключил стили и скрипты, но стили и скрипты не загружаются хотя если посмотреть исходный код страницы...

148
Как в woocommerce вывести товары по произвольному полю

Как в woocommerce вывести товары по произвольному полю

Столкнулась с проблемой: есть товары с одинаковым значением произвольного поляНужно вывести на странице товара, товары с таким же произвольным...

172
var_dump не выводит массив

var_dump не выводит массив

Получаю сообщению по вебсокету, здесь по одному их обрабатываюПочему если убрать первый var_dump, то второй ничего не выведет, а с первым var_dump...

210