Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.06.2020, 17:39
Аватар для thislegion
Интересующийся
Отправить личное сообщение для thislegion Посмотреть профиль Найти все сообщения от thislegion
 
Регистрация: 18.05.2020
Сообщений: 14

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

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); 
 
}
Ответить с цитированием
  #2 (permalink)  
Старый 04.06.2020, 17:57
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

Последний раз редактировалось laimas, 04.06.2020 в 18:02.
Ответить с цитированием
  #3 (permalink)  
Старый 04.06.2020, 18:11
Аватар для thislegion
Интересующийся
Отправить личное сообщение для thislegion Посмотреть профиль Найти все сообщения от thislegion
 
Регистрация: 18.05.2020
Сообщений: 14

Сообщение от laimas Посмотреть сообщение
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>
Ответить с цитированием
  #4 (permalink)  
Старый 04.06.2020, 18:20
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от 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 должна быть объявлена как массив), зачем только это нужно не понимаю.

Последний раз редактировалось laimas, 04.06.2020 в 18:50.
Ответить с цитированием
  #5 (permalink)  
Старый 04.06.2020, 21:11
Аватар для thislegion
Интересующийся
Отправить личное сообщение для thislegion Посмотреть профиль Найти все сообщения от thislegion
 
Регистрация: 18.05.2020
Сообщений: 14

Спасибо laimas, ситуация прояснилась.
Ответить с цитированием
  #6 (permalink)  
Старый 05.06.2020, 09:22
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от 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, но с ещё большими преимуществами.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
контент из XMLHttpRequest response с помощью innerHTML не работает m4ybe Events/DOM/Window 9 24.01.2018 14:35
Цикл завешивает страницу, помогите Romingood jQuery 5 19.10.2013 14:30
jQyery функция странно работает! Midel Общие вопросы Javascript 4 08.04.2012 13:40
Не работает цикл for lyoka14 Общие вопросы Javascript 2 26.03.2012 08:47
Safari + ajax некорректно работает, а в других работает demi AJAX и COMET 35 15.07.2009 14:11