Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Вытащить данные из массива (https://javascript.ru/forum/jquery/54916-vytashhit-dannye-iz-massiva.html)

Влад_имир 06.04.2015 14:01

Вытащить данные из массива
 
Вложений: 1
Получил на клиенте ответ см. скриншот. 1 вопрос как мне вытащить оттуда данные
$.each(data[0], function(index, value) {
  alert(index + ': ' + value);
});

не помогло и 2-й вопрос. при поторном запросе аяксом массив , становиться в 2 раза больше, как мне его обнулить или уничтожить?

laimas 06.04.2015 14:09

Это не ответ, это вывод массива в удобной форме посредством print_r(). Для клиента такой вывод не годится - возвращайте клиенту JSON-данные, в крайнем случае строку с разделителем.
А в два раза больше, это что-то с логикой php-обработчика, что не известно, показывайте.

Влад_имир 06.04.2015 14:17

$data= json_encode ($otvet); на серверной стороне , $otvet - массив, в который запихано 3 строковых переменных.
на клиенте
success: function (data)
			{ 
					if (data )
						{
						alert("Пришли данные " + data);
.....

Что не так? А подручными средствами jquery этот массив не раздербанить?

laimas 06.04.2015 14:30

Если json_encode([9176, 1234, 10]), то на клиенте тип ожидаемых данных должен быть указан как json, а в success: function (data) будет достаточно обычного цикла, например:
while(v = data.pop()) {
    alert(v)
}

Если важно получение элементов с массива с первого, тогда .shift() вместо pop(). Единственное условие в этом случае, это отсутствие в массиве значения равного 0, при другом раскладе, это не будет проблемой.

А вот "удвоение" данных при повторном запросе, так json_encode на это не влияет. При каждом запросе массив $_POST будет перезаписываться данными пришедшими с клиента, а значит либо вы что-то не то химичите с $otvet, либо клиент вам шлет такое.

Влад_имир 06.04.2015 14:30

laimas,
Действительно print_r() в обработчике стоял, убрал и ничего не идет

Влад_имир 06.04.2015 14:34

laimas,
т.е лучше $otvet сделать не массивом , а строкой и разделитель вставить точку с запятой. Тогда json_encode заработает ?

Влад_имир 06.04.2015 14:37

laimas,
У меня в обработчике генерится случайное число и до конца работы проги оно должно существовать. Вот я его и гоняю по кругу.

laimas 06.04.2015 14:39

Зачем строкой? Вы отдаете их как json, на клиенте это будет массив. Не было бы у вас по каким-то причинам возможности работать с этим типом данных, можно было бы в этом случае предать и строку, получив из нее на клиенте массив.
У вас что с переданными json-данными на клиенте проблемы?

>в обработчике генерится случайное число

Если речь об одном значение, то к чему тогда массив?

Влад_имир 06.04.2015 14:48

Цитата:

Сообщение от laimas (Сообщение 365210)
Зачем строкой? Вы отдаете их как json, на клиенте это будет массив. Не было бы у вас по каким-то причинам возможности работать с этим типом данных, можно было бы в этом случае предать и строку, получив из нее на клиенте массив.
У вас что с переданными json-данными на клиенте проблемы?

>в обработчике генерится случайное число

Если речь об одном значение, то к чему тогда массив?

Нужно из обработчика передать 3 числа, одно из них случайно сгенерированное, я и подумать не мог, что геморр такой будет. Просто закинул их в массив.

laimas 06.04.2015 14:51

Если три числа, то массив. Геморрой... а с чем именно? В чем проблема то?

Влад_имир 06.04.2015 14:56

$data= json_encode ($otvet); не приходит на клиент.

Влад_имир 06.04.2015 15:02

Цитата:

Сообщение от laimas (Сообщение 365201)
Если json_encode([9176, 1234, 10]), то на клиенте тип ожидаемых данных должен быть указан как json, а в success: function (data) будет достаточно обычного цикла, например:
while(v = data.pop()) {
    alert(v)
}

У меня json_encode на скриншоте показан. А как его к такому виду подогнать ([9176, 1234, 10]) ?

Влад_имир 06.04.2015 15:10

json_encode не работает или работает но не так

laimas 06.04.2015 15:30

На изображении вашем, это не JSON, а результат работы hrint_r(array), а вот json_encode() этого массива будет выглядеть именно как [9176,1234,10].
Привести к виду json_encode([9176, 1234, 10])...
Это не приведение к виду, а объявление массива в аргументе функции json_encode(), причем такое объявление возможно только в версии РНР не ниже 5.4, в младших необходимо объявлять массив как array(9176, 1234, 10).
Вам же этого не требуется вообще, это я в пояснении так написал, у вас массив для ответа клиенту это $otvet, хотя уж лучше отучать себя от такого "жаргона".

Вы не показываете кода сервера, код клиента только частично, не описываете проблему, значит и ответить затруднительно.

Влад_имир 06.04.2015 15:40

серверная часть
<? 
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;
	}
	
});
});

Влад_имир 06.04.2015 15:42

data.length=0;
пытался обнулить массив ,чтобы не происходило накопление массивов, но не работает

Влад_имир 06.04.2015 15:49

data приходит как на скриншоте

Влад_имир 06.04.2015 15:51

а еще 2 функции в обработчике gen, buki вынесены в другой файл

laimas 06.04.2015 16:01

Вспомнил, вы уже писал подобный пост. Если вы работаете только с числами и их значения должны быть нулевыми, то 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 - это из чего возврат, если это не функция и не цикл?

Влад_имир 06.04.2015 16:09

dataType : "json" , я же отправляю не в json формате.

Влад_имир 06.04.2015 16:14

$("#p1").text(data); выводит
Array ( [0] => 5893 [1] => 1234 [2] => 10 )
$("#p1").text(data[0]); выводит
A
как обратится , что лежит в нулевой ячейке?

Влад_имир 06.04.2015 16:19

$("#p1").text(data);
выводит
Array ( [0] => 1563 [1] => 1234 [2] => 11 )
$("#p1").text(data[0]);
выводит
А

laimas 06.04.2015 16:25

dataType : "json" - это тип не отправляемых данных, а ожидаемый тип данных возвращенных сервером.

laimas 06.04.2015 16:28

$("#p1").text(data[0]) выводит А, потому что у вас сервер возвращает не JSON, а строку:
Array ( [0] => 1563 [1] => 1234 [2] => 11 )

Влад_имир 06.04.2015 16:29

Цитата:

Сообщение от laimas (Сообщение 365250)
dataType : "json" - это тип не отправляемых данных, а ожидаемый тип данных возвращенных сервером.

если его устанавливаю, в браузере чисто, в консоле XHR finished loading: POST "http://as/obrabot.php".

laimas 06.04.2015 16:45

Давайте я напишу простой пример, который будет отправлять данные серверу (форму), принимать от него 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>

Понятно по коду? Запустите его, проблем нет?

Влад_имир 06.04.2015 16:50

Вложений: 1
Во че нашел. это при dataType : "json"

laimas 06.04.2015 17:04

Это не JSON - в json ответе не будет Array.

Влад_имир 07.04.2015 12:05

Цитата:

Сообщение от laimas (Сообщение 365251)
$("#p1").text(data[0]) выводит А, потому что у вас сервер возвращает не JSON, а строку:
Array ( [0] => 1563 [1] => 1234 [2] => 11 )

А как сделать из строки массив?

laimas 07.04.2015 12:12

Зачем вам строка, чем вас не удовлетворяет JSON? Передавайте JSON, а не выполняйте print_r(), и проблем не будет.

Влад_имир 07.04.2015 12:21

Цитата:

Сообщение от laimas (Сообщение 365418)
Зачем вам строка, чем вас не удовлетворяет JSON? Передавайте JSON, а не выполняйте print_r(), и проблем не будет.

Я не понимаю как мне вытащить из data на клиенте данные.

Влад_имир 07.04.2015 12:25

Если не выполнять print_r вообще ничего не приходит клиенту

Влад_имир 07.04.2015 12:33

Вложений: 1
Вот это массив приходит? Млин, это опять с принтом.

Влад_имир 07.04.2015 12:50

Я думаю нужно как-то этот массив переделать что бы был такого вида
array(1=>'2548',2=>'1234',3=>'00'), пытаюсь и ниче не получается.

laimas 07.04.2015 13:46

Ну я же вам показывал как в этом примере.

Зачем вам массив с ключами начиная с 1? Они как-то связаны с элементами на странице?

Влад_имир 07.04.2015 13:49

нет, просто на автомате напечатал.

laimas 07.04.2015 14:07

Тогда json-строка array(2548, 1234, '00') будет выглядеть так - [2548, 1234, '00'], будет обработана по получению и будет являться js-массивом с именем определенным в callback-функции, например data. Тогда получить его первый элемент, это data[0], второй data[1] и т.д.

Влад_имир 07.04.2015 14:11

Вложений: 1
Ну вот , вроде json, только опять без принта ничего не приходит

laimas 07.04.2015 14:25

Какой print? Есть функция print(), есть print_r() и это разные по назначению функции.

Влад_имир 07.04.2015 15:32

print_r()


Часовой пояс GMT +3, время: 02:02.