Вытащить данные из массива
Вложений: 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, время: 16:51. |