Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Не работает цикл (https://javascript.ru/forum/dom-window/80436-ne-rabotaet-cikl.html)

thislegion 04.06.2020 17:39

Не работает цикл
 
Такая конструкция цикла не работает

for (let i = 0; i < 2; i++) {
 
let сours[i]= <?=$arr[i][1]; ?>;
document.write(сours[i]); 
 
}


<?=$arr[i][1]; ?> - php скрипт, где $arr[i][1] вывод из массива $arr

Как сделать так чтобы выводилось сours0, сours1, сours2 ? Вот так не выходит:

for (let i = 0; i < 2; i++) {
 
let сours.i = <?=$arr[i][1]; ?>;
document.write(сours.i); 
 
}

laimas 04.06.2020 17:57

for (let i = 0; i < 2; i++) - это выполнение цикла на клиентской стороне, в браузере, где серверный скрипт отсутствует. Как может РНР знать о текущей итерации этого цикла (<?=$arr[i][1]; ?>), если его на клиенте нет?

thislegion 04.06.2020 18:11

Цитата:

Сообщение от laimas (Сообщение 525431)
for (let i = 0; i < 2; i++) - это выполнение цикла на клиентской стороне, в браузере, где серверный скрипт отсутствует. Как может РНР знать о текущей итерации этого цикла (<?=$arr[i][1]; ?>), если его на клиенте нет?

Но так ведь все работает:

<?
$arr=[0.99,1.15,2.83];
?>
<script>
let сours0 = <?=$arr[0]; ?>;
let сours1 = <?=$arr[1]; ?>;
//document.write(сours1);
alert(сours0);
alert(сours1);
</script>

laimas 04.06.2020 18:20

Цитата:

Сообщение от thislegion
Но так ведь все работает

А разве это одно и тоже, что и ранее представленное? Этот код <?=$arr[i][1]; ?> на сервере сгенерирует предупреждение, если их вывод разрешен. А в режиме отладки, это лучше делать, так как безобидное, на первый взгляд, предупреждение, может быть причиной и дальнейших ошибок.

Этот код заставит РНР искать среди констант константу i (то что прописано выше, let i = 0, ничего не значит, это просто текст, который РНР выдает в браузер), и не найдя ее вернет NULL, и $arr[i][1] также вернет NULL, ибо такого элемента в массиве $arr нет.

Здесь же:

<script>
let сours0 = <?=$arr[0]; ?>;
let сours1 = <?=$arr[1]; ?>;
//document.write(сours1);
alert(сours0);
alert(сours1);
</script>

вывод в браузер кода в теге <script>, который будет выполнен на клиенте, и в котором js переменным сours0, сours1 посредством РНР будет вставлены значения из массива, также определенного в РНР. В итоге браузер получит на странице следующее:

<script>
let сours0 = 0.99;
let сours1 = 1.15;
//document.write(сours1);
alert(сours0);
alert(сours1);
</script>


и что без проблем в нем будет выполнено.

PS. Если вы хотите массив определяемый сервером обойти в цикле на клиенте, нужно этот массив передать клиенту как JS массив, например так (до for (let i = 0; i < 2; i++)):

let arr = <?=json_encode($arr)?>;


И если его нужно весь обойти, то не i < 2; (если размер массива увеличится, то это потребует и изменения кода), а i < arr.length;, и вместо let сours[i]= <?=$arr[i][1]; ?>;, let сours[i]= arr[i]; (при этом сours должна быть объявлена как массив), зачем только это нужно не понимаю.

thislegion 04.06.2020 21:11

Спасибо laimas, ситуация прояснилась.

Malleys 05.06.2020 09:22

Цитата:

Сообщение от thislegion
Как сделать так чтобы выводилось сours0, сours1, сours2 ? Вот так не выходит:

Как правило, использование языка X для генерации кода на языке Y является плохой практикой, обладающей большим количеством недостатков, чем реально практически полезных случаев.

Вам следует скачать нужные данные (ваш массив) с сервера или подключить данные к странице. Давайте рассмотрим пример с подключением данных...

index.php
<?php

$data = [
	'arr' => [0.99, 1.15, 2.83]
];

?>

<script> window['cfg'] = <?= json_encode($data); ?>; </script>
<script src="app.js"></script>


app.js
const { arr } = window.cfg;

for (let i = 0; i < arr.length; i++) {
    let сours = arr[i];
    document.write(сours); 
}


Таким образом, PHP код занят только заполнением структуры данных, а JavaScript только использованием предоставленной структуры данных.

Такое разделение позволяет легко добавить асинхронную загрузку данных (xhr или fetch) в будущем. Скрипт статичен и может быть кэширован. Разделение проблем JS и PHP. Возможность использовать все блага экосистемы JS — среди которых минификация, транспиляция кода и пр.

Содержание данных PHP в объекте window['cfg'] подходит для большинства случаев использования, но лучше всего отделить его полностью. Вы можете использовать RESTful API для запроса только тех данных, которые вам нужны, это чуть больше JavaScript, но с ещё большими преимуществами.


Часовой пояс GMT +3, время: 21:50.