загрузка массива PHP в JavaScript - PullRequest
5 голосов
/ 19 марта 2012

, так что я полный нуб php / javascript.

Я пытаюсь загрузить полный массив php в массив javascript.Я написал это для Javascript:

    var names = new Array();
for(var i = 0; i < 48; i++) {
    names[i] = "<?php echo giveJS() ?>";
}

И это для php

static $counter = 0;

function giveJS() {
    global $names;
    global $counter;
    $counter++;
    return $names[$counter]; 
}

Я уже проверил, правильно ли массив php заполнен данными.Когда я пишу строку вывода в javascript, например,

document.write(names[10]);

, она дает мне только первую запись в массиве php, поэтому кажется, что каждый раз, когда цикл for повторяется, он инициализирует файл php с нуля, и поэтому установкасчетчик до 0. Как я могу это исправить?

Ответы [ 6 ]

6 голосов
/ 19 марта 2012

In php

//Bla being the php array you want to give to javascript. Create it however you like
$bla = array();
$bla[] = 'cat';
$bla[] = 'dog';
$bla[] = 'bat';
echo '<script>var myarray = '.json_encode($bla) .';</script>';

Приведенный выше код выведет тег сценария, содержащий переменную myarray, содержимым которой будет JSON, указывающий указанный выше массив (json_encode форматирует массив во внутренний синтаксис javascript- массив, вероятно, будет выглядеть как ['cat', 'dog', 'bat])

Затем вы можете получить значения из массива JavaScript следующим образом:

<script>
 console.log(myarray[2]);
</script>
2 голосов
/ 19 марта 2012

Это распространенная ошибка для людей, начинающих веб-разработку. Важно понимать, что весь ваш PHP-код запускается до запуска javascript *. Если вы посмотрите на javascript, который попадает в браузер, вы увидите

    var names = new Array();
for(var i = 0; i < 48; i++) {
    names[i] = "foo";
}

, который объясняет, почему каждый элемент одинаков. Лучший способ сделать это - использовать json_encode в PHP, чтобы просто перевести массив в переменную JS. Как это:

var names=<?php echo json_encode($names);?>;

* Для людей, пишущих комментарии о Javascript, работающем одновременно с PHP, либо с ранним запуском JS, либо с использованием AJAX, да, я в курсе, но для новичка модель PHP полностью генерирует, затем запускается JS бегать проще для понимания.

2 голосов
/ 19 марта 2012

Ваш PHP-код выполняется перед вашим Javascript, поэтому использовать его таким образом не имеет смысла.

Вместо этого вы должны сделать что-то вроде этого:

<?php for ($i=0;$i<48;$i++):?>
     name[<?php echo $i;?>] = "<?php echo giveJS();?>";
<?php endfor; ?>

На самом деле, если ваш PHP такой простой, вам не нужна функция:

<?php foreach ($names as $i=>$name):?>
    name[<?php echo $i;?>] = "<?php echo $name;?>";
<?php endforeah;?>

В обоих случаях у вас будет такой Javascript:

name[0] = 'name0';
name[1] = 'name1';
...
name[47] = 'name47';
1 голос
/ 19 марта 2012

Допустим, $names[1] - это "Bob" ..

Ваш PHP-скрипт будет запускаться на сервере , с выводом следующего JavaScript:

var names = new Array();
for(var i = 0; i < 48; i++) {
    names[i] = "Bob";
}

, который, в свою очередь, будет запускать в вашем браузере (клиент), создавая массив names с 48 "Bob" элементами.


НелегкоРазговор между PHP и JavaScript.Либо (1) ваш PHP-скрипт выводит все, что JavaScript должен знать с самого начала, либо (2) вы общаетесь с сервером по мере необходимости, используя AJAX .

В вашем случае JSONEncode , вероятно, является лучшим решением, так как он выведет массив в JavaScript Object Notation , устраняя необходимость инициализации на основе цикла.

0 голосов
/ 19 марта 2012

Я думаю, json_encode() - это то, что вы ищете.

Пример

<?php
$myArray = array('generating', 'some', 'items');
?>
<script type="text/javascript>
    var myArray = <?= json_encode($myArray); ?>;
</script>
0 голосов
/ 19 марта 2012

Зависит от того, сколько измерений имеет ваш массив. Кратчайший путь для простого массива:

 var names = new Array(<?php echo implode(',', $php_array);?>);
...