Вытащить данные из массива
Вложений: 1
Получил на клиенте ответ см. скриншот. 1 вопрос как мне вытащить оттуда данные
$.each(data[0], function(index, value) { alert(index + ': ' + value); }); не помогло и 2-й вопрос. при поторном запросе аяксом массив , становиться в 2 раза больше, как мне его обнулить или уничтожить? |
Это не ответ, это вывод массива в удобной форме посредством print_r(). Для клиента такой вывод не годится - возвращайте клиенту JSON-данные, в крайнем случае строку с разделителем.
А в два раза больше, это что-то с логикой php-обработчика, что не известно, показывайте. |
$data= json_encode ($otvet); на серверной стороне , $otvet - массив, в который запихано 3 строковых переменных.
на клиенте success: function (data) { if (data ) { alert("Пришли данные " + data); ..... Что не так? А подручными средствами jquery этот массив не раздербанить? |
Если json_encode([9176, 1234, 10]), то на клиенте тип ожидаемых данных должен быть указан как json, а в success: function (data) будет достаточно обычного цикла, например:
while(v = data.pop()) { alert(v) } Если важно получение элементов с массива с первого, тогда .shift() вместо pop(). Единственное условие в этом случае, это отсутствие в массиве значения равного 0, при другом раскладе, это не будет проблемой. А вот "удвоение" данных при повторном запросе, так json_encode на это не влияет. При каждом запросе массив $_POST будет перезаписываться данными пришедшими с клиента, а значит либо вы что-то не то химичите с $otvet, либо клиент вам шлет такое. |
laimas,
Действительно print_r() в обработчике стоял, убрал и ничего не идет |
laimas,
т.е лучше $otvet сделать не массивом , а строкой и разделитель вставить точку с запятой. Тогда json_encode заработает ? |
laimas,
У меня в обработчике генерится случайное число и до конца работы проги оно должно существовать. Вот я его и гоняю по кругу. |
Зачем строкой? Вы отдаете их как json, на клиенте это будет массив. Не было бы у вас по каким-то причинам возможности работать с этим типом данных, можно было бы в этом случае предать и строку, получив из нее на клиенте массив.
У вас что с переданными json-данными на клиенте проблемы? >в обработчике генерится случайное число Если речь об одном значение, то к чему тогда массив? |
Цитата:
|
Если три числа, то массив. Геморрой... а с чем именно? В чем проблема то?
|
$data= json_encode ($otvet); не приходит на клиент.
|
Цитата:
|
json_encode не работает или работает но не так
|
На изображении вашем, это не JSON, а результат работы hrint_r(array), а вот json_encode() этого массива будет выглядеть именно как [9176,1234,10].
Привести к виду json_encode([9176, 1234, 10])... Это не приведение к виду, а объявление массива в аргументе функции json_encode(), причем такое объявление возможно только в версии РНР не ниже 5.4, в младших необходимо объявлять массив как array(9176, 1234, 10). Вам же этого не требуется вообще, это я в пояснении так написал, у вас массив для ответа клиенту это $otvet, хотя уж лучше отучать себя от такого "жаргона". Вы не показываете кода сервера, код клиента только частично, не описываете проблему, значит и ответить затруднительно. |
серверная часть
<? require 'function.php'; header("Content-type: text/plain; charset=utf-8"); $errors = array(); $otvet=array(); if (isset($_POST['int'])) {$str = $_POST['int'];} if (isset($_POST['hidden'])) { if(true==empty($_POST['hidden'])) { /* echo 'Перепенная пустая!'; */ $a=str_split(gen()); $string = implode("", $a); $otvet[]= $string; } else { /* echo ' не пустая!'; */ /* var_dump (isset($_POST['hidden'])); */ $iskomoe_chislo = $_POST['hidden']; /* print_r ($iskomoe_chislo); */ $otvet[]=$iskomoe_chislo; } } $arr1 = str_split($str); $result = array_unique($arr1); if (isset($arr1)) { $length_arr1=count ($arr1); } if (isset($result)) { $length_result=count ($result); } if ($length_result<$length_arr1) { $errors[] ="Нельзя вводить повторяющиеся цифры!!"; } if(isset($errors[0])){ echo $errors[0]; return false; } $otvet[]= $str; $otvet[]=buki($a,$arr1); print_r ($otvet); $data= json_encode ($otvet); ?> клиентская $(document).ready(function(){ jQuery.validator.addMethod( 'regexp', function(value, element, regexp) { var re = new RegExp(regexp); return this.optional(element) || re.test(value); }, "" ); $("#formdata").validate({ rules: { int: { required: true, minlength: 4, maxlength: 4, number : true, regexp: '^[1-9]{1}[0-9]*$' } }, messages:{ int:{ required: "поле не заполнено или заполнено не верно", minlength: "в поле должно быть минимум 4 символа", maxlength: "В поле должно быть максимум 4 символа", number : "В поле должны быть только цифры", regexp: "Число не должно начинаться на ноль!!" } }, submitHandler: function() { //это обработчик нажатия кнопки ОТПРАВИТЬ var data = $("#formdata").serialize(); $.ajax({// инициализируем ajax запрос type: 'POST', // отправляем в POST формате url: '../obrabot.php', // путь до обработчика, у нас он лежит в той же папке data: data, // данные для отправки /* cache: false, */ success: function (data) { if (data ) { alert("Пришли данные " + data); if (data=='Нельзя вводить повторяющиеся цифры!!') { $('#error').html(data).fadeIn(200); $('#formdata')[0].reset(); $('#error').html(data).fadeOut(2000); } else { alert (data.length); $('input[type="hidden"]').val(data); $("#p1").text(data[2]); data.length=0; } } else { alert("no ok"); } } }); return false; } }); }); |
data.length=0;
пытался обнулить массив ,чтобы не происходило накопление массивов, но не работает |
data приходит как на скриншоте
|
а еще 2 функции в обработчике gen, buki вынесены в другой файл
|
Вспомнил, вы уже писал подобный пост. Если вы работаете только с числами и их значения должны быть нулевыми, то POST принимать надо с приведения его значений к iteger:
$_POST = array_map('intval', $_POST) А далее проверка без всяких if(true==empty($_POST['hidden'])) и дальнейших if (isset($arr1))... Работая с JSON, укажите методу .ajax тип данных dataType : "json" Но в этом случае РНР сценарий должен возвращать именно этот формат, а не смесь, к примеру: echo $errors[0] - а зачем тогда Error массив, если возвращается только первый его элемент при ошибке? А если возвращается массив ошибок, то почему не в json формате? return false - это из чего возврат, если это не функция и не цикл? |
dataType : "json" , я же отправляю не в json формате.
|
$("#p1").text(data); выводит
Array ( [0] => 5893 [1] => 1234 [2] => 10 ) $("#p1").text(data[0]); выводит A как обратится , что лежит в нулевой ячейке? |
$("#p1").text(data);выводит Array ( [0] => 1563 [1] => 1234 [2] => 11 ) $("#p1").text(data[0]);выводит А |
dataType : "json" - это тип не отправляемых данных, а ожидаемый тип данных возвращенных сервером.
|
$("#p1").text(data[0]) выводит А, потому что у вас сервер возвращает не JSON, а строку:
Array ( [0] => 1563 [1] => 1234 [2] => 11 ) |
Цитата:
|
Давайте я напишу простой пример, который будет отправлять данные серверу (форму), принимать от него json данные и выводить их. А вы уж смотрите что у вас не так делается.
<? if($_POST) exit(json_encode(array_values($_POST))); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <style> </style> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <script> $(function() { $('form').submit(function() { $.post(location, $(this).serialize(), function(d) { $('#res').html(d.join('<br>')) }, 'json'); return false; }); }); </script> </head> <body> <form> <input name="as1" value="111"> <input name="as2" value="222"> <input name="as3" value="333"> <button>Send</button> </form> </div> <p id="res"></p> </body> </html> Понятно по коду? Запустите его, проблем нет? |
Вложений: 1
Во че нашел. это при dataType : "json"
|
Это не JSON - в json ответе не будет Array.
|
Цитата:
|
Зачем вам строка, чем вас не удовлетворяет JSON? Передавайте JSON, а не выполняйте print_r(), и проблем не будет.
|
Цитата:
|
Если не выполнять print_r вообще ничего не приходит клиенту
|
Вложений: 1
Вот это массив приходит? Млин, это опять с принтом.
|
Я думаю нужно как-то этот массив переделать что бы был такого вида
array(1=>'2548',2=>'1234',3=>'00'), пытаюсь и ниче не получается. |
Ну я же вам показывал как в этом примере.
Зачем вам массив с ключами начиная с 1? Они как-то связаны с элементами на странице? |
нет, просто на автомате напечатал.
|
Тогда json-строка array(2548, 1234, '00') будет выглядеть так - [2548, 1234, '00'], будет обработана по получению и будет являться js-массивом с именем определенным в callback-функции, например data. Тогда получить его первый элемент, это data[0], второй data[1] и т.д.
|
Вложений: 1
Ну вот , вроде json, только опять без принта ничего не приходит
|
Какой print? Есть функция print(), есть print_r() и это разные по назначению функции.
|
print_r()
|
Часовой пояс GMT +3, время: 02:02. |