Pass Javascript Array -> PHP - PullRequest
       3

Pass Javascript Array -> PHP

57 голосов
/ 18 февраля 2011

Допустим, у меня есть массив javascript с кучей элементов (где-то от 50 до 200).

Я хочу отправить это в PHP (подготовленный оператор), используя ajax.В настоящее время я .load PHP-файл много раз внутри цикла, но я хочу преобразовать его в массив и отправить массив один раз, загружая PHP-файл один раз вместо 50-200 раз.

array[i] = variable;

Ответы [ 5 ]

98 голосов
/ 18 февраля 2011

Вы можете использовать JSON.stringify(array) для кодирования вашего массива в JavaScript, а затем использовать $array=json_decode($_POST['jsondata']); в своем скрипте PHP для его извлечения.

28 голосов
/ 18 февраля 2011

AJAX-запросы ничем не отличаются от запросов GET и POST, инициируемых с помощью элемента <form>. Это означает, что вы можете использовать $ _GET и $ _POST для получения данных.

Когда вы делаете запрос AJAX (пример jQuery):

// JavaScript file

elements = [1, 2, 9, 15].join(',')
$.post('/test.php', {elements: elements})

Это (почти) эквивалентно публикации этой формы:

<form action="/test.php" method="post">
  <input type="text" name="elements" value="1,2,9,15">
</form>

В обоих случаях на стороне сервера вы можете прочитать данные из переменной $ _POST:

// test.php file

$elements = $_POST['elements'];
$elements = explode(',', $elements);

Ради простоты я соединяю элементы здесь через запятую. Однако сериализация JSON является более универсальным решением.

2 голосов
/ 18 февраля 2011

Вот функция для преобразования массива или объекта js в php-совместимый массив, который будет отправлен в качестве параметра http get request:

function obj2url(prefix, obj) {
        var args=new Array();
        if(typeof(obj) == 'object'){
            for(var i in obj)
                args[args.length]=any2url(prefix+'['+encodeURIComponent(i)+']', obj[i]);
        }
        else
            args[args.length]=prefix+'='+encodeURIComponent(obj);
        return args.join('&');
    }

Префикс - это имя параметра.

EDIT:

var a = {
    one: two,
    three: four
};

alert('/script.php?'+obj2url('a', a)); 

Будет выдавать

/script.php?a[one]=two&a[three]=four

, что позволит вам использовать $ _GET ['a'] в качестве массива в script.php.Вам нужно будет найти свой любимый движок ajax, указав URL для вызова script.php из js.

0 голосов
/ 07 марта 2014

Вы можете перенести массив из JavaScript в PHP ...

Javascript ... ArraySender.html

<script language="javascript">

//its your javascript, your array can be multidimensional or associative

plArray = new Array();
plArray[1] = new Array(); plArray[1][0]='Test 1 Data'; plArray[1][1]= 'Test 1'; plArray[1][2]= new Array();
plArray[1][2][0]='Test 1 Data Dets'; plArray[1][2][1]='Test 1 Data Info'; 
plArray[2] = new Array(); plArray[2][0]='Test 2 Data'; plArray[2][1]= 'Test 2';
plArray[3] = new Array(); plArray[3][0]='Test 3 Data'; plArray[3][1]= 'Test 3'; 
plArray[4] = new Array(); plArray[4][0]='Test 4 Data'; plArray[4][1]= 'Test 4'; 
plArray[5] = new Array(); plArray[5]["Data"]='Test 5 Data'; plArray[5]["1sss"]= 'Test 5'; 

function convertJsArr2Php(JsArr){
    var Php = '';
    if (Array.isArray(JsArr)){  
        Php += 'array(';
        for (var i in JsArr){
            Php += '\'' + i + '\' => ' + convertJsArr2Php(JsArr[i]);
            if (JsArr[i] != JsArr[Object.keys(JsArr)[Object.keys(JsArr).length-1]]){
                Php += ', ';
            }
        }
        Php += ')';
        return Php;
    }
    else{
        return '\'' + JsArr + '\'';
    }
}


function ajaxPost(str, plArrayC){
    var xmlhttp;
    if (window.XMLHttpRequest){xmlhttp = new XMLHttpRequest();}
    else{xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");}
    xmlhttp.open("POST",str,true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.send('Array=' + plArrayC);
}

ajaxPost('ArrayReader.php',convertJsArr2Php(plArray));
</script>

и код PHP ... ArrayReader.php

<?php 

eval('$plArray = ' . $_POST['Array'] . ';');
print_r($plArray);

?>
0 голосов
/ 18 февраля 2011

Так что используйте цикл на стороне клиента для создания двумерного массива ваших массивов и отправьте все это в PHP за один запрос.

На стороне сервера вам понадобится еще один циклкоторый выполняет свою обычную вставку / обновление для каждого подмассива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...