Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Вывод элементов массива (https://javascript.ru/forum/dom-window/80538-vyvod-ehlementov-massiva.html)

Volun 18.06.2020 07:42

Вывод элементов массива
 
В ответе сервера получаю массив, и вывожу из него элементы в таблицу, затем отдельно показываю последний элемент (ed), а вот первый (sd) показать не получается, помогите пожалуйста
function(data) {

    sc = "<h2>" + data.user.name + "</h2>";
    var wf = "";
    var sd = "";
    var ed = "";
    
    $.each(data.list, function(index, val) {

      wf += "<tr><td>" + val.dt_txt + "</td>"; 
      wf += "<td>" + val.main.min + "</td>";
      wf += "<td>" + val.main.max + "</td>"; 
      wf += "<td>" + val.wind.speed + "</td></tr>";
      ed = "<span>End" + val.dt_txt + "</span>";
      sd = "<span>Start" + val.dt_txt + "</span>";


    });
    
    $("#showС").html(sc);
    $("#start").html(sd);
    $("#end").html(ed);
    $("#showT").html(wf);
  }

laimas 18.06.2020 07:50

А что значит первый? index - это индексы массива, он может указывать на первый элемент массива (у вас массив объектов). А val, это свойства объектов, где val.dt_txt, это не первый элемент, а свойство dt_txt объектов. Вы переменной постоянно присваиваете это свойство (переопределяется), а значит по окончанию работы цикла в ней будет значение этого свойства последнего объекта массива data.list. Если нужно значение первого объекта, тогда в цикле так:

if(!index) sd = "<span>Start" + val.dt_txt + "</span>";

Volun 18.06.2020 13:08

Спасибо, все правильно. Еще один вопрос вдогонку. Я записываю массив в localstorage, потом вызываю его и пытаюсь передать как параметр

...
    localStorage.setItem('user', JSON.stringify(data));
...
    data = JSON.parse(localStorage.getItem('user'));

$.ajax({
  url: 'save.php?q='+data,
  dataType: "json",
  type: "POST",
...


но в результате передается только такая строка
save.php?q=[object Object]


что делаю неправильно?

laimas 18.06.2020 13:23

data = JSON.parse(localStorage.getItem('user'));

data = localStorage.getItem('user');
//и в запросе так
url: 'save.php',
data: {q: data},
....


А на сервере полученный json декодировать:

$data = json_decode($_POST['q']);


Декодирование вернет либо объект (по умолчанию), либо массив, если вторым параметром указать true.

Volun 18.06.2020 15:54

Спасибо, сделал как вы посоветовали, теперь массив передается, но на сервере пытаюсь посмотреть через
echo $data;

,но вижу пустоту.

laimas 18.06.2020 16:09

Цитата:

Сообщение от Volun
теперь массив передается, но на сервере пытаюсь посмотреть через

А откуда тогда вы знаете, что он передается? Если все сделано правильно и на сервере после декодирования был получен объект, то парсер бы выдал ошибку:

Catchable fatal error: Object of class stdClass could not be converted to string

с именем файла и строкой, в которой ошибка была обнаружена. Если после декодирования был получен массив, то вывелся бы тип данных - Array.

Массивы/объекты конструкцией echo нельзя просмотреть, для этого служат функции print_r и var_dump. Надо же не самодеятельностью заниматься, а читать и изучать.

Volun 18.06.2020 16:33

Спасибо, я как раз и учусь. В консоли вижу что в save.php передается такой массив

q: {"cod":"200","message":0,"cnt":40,"list":[{"dt":1592492400,"main":{"temp":29.27,"feels_like":29.65,"temp_min":28.75,"temp_max":29.27,"pressure":1017,"sea_level":1016,"grnd_level":1001,"humidity":43,"temp_kf":0.52},"weather":[{"id":802,"main":"Clouds","description":"scattered+clouds","icon":"03d"}],"clouds":{"all":35},"wind":{"speed":1.65,"deg":240},"sys":{"pod":"d"},"dt_txt":"2020-06-23+12:00:00"}],"city":{"id":524901,"name":"Moscow","coord":{"lat":55.7522,"lon":37.6156},"country":"RU","population":1000000,"timezone":10800,"sunrise":1592441057,"sunset":1592504230}}

и пытаюсь на сервере получить из него значение city.name
на сервере выдает ошибку

PHP Notice: Undefined index: q in save.php on line 13

файл save.php такой

<?php
$servername = "";
$username = "";
$password = "";
$db = "";

$conn = new mysqli($servername, $username, $password, $db);

if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

$data = json_decode($_POST['q']);


print_r ($data);

?>

laimas 18.06.2020 16:44

Цитата:

Сообщение от Volun
я как раз и учусь

На чем же вы учитесь, если содержимое массива (как вы того ожидаете) пытаетесь выводить с помощью echo? Скачайте (выбирайте CHM с примерами) хотя бы руководство и изучайте в нем назначение функций.

Консоль показывает что передается на сервер, но это не значит что вы получили. На сервер передается на массив, а JSON, который представляет из себя строку (data = localStorage.getItem('user')). На сервере нужно получить по ключу q эту строку и декодировать (найдите в руководстве функцию json_decode и почитайте о ней).

Если бы вы на сервере получили бы, сделали бы все верно, то после echo $date вы бы получили либо ошибку, либо сообщение Array. У вас же вообще ничего, то есть, $data не определена, равна null.

Как вы на сервере принимаете данные?

laimas 18.06.2020 16:52

Разберетесь с этим, тогда можно будет сказать как передать объект (это содержит ваш json), а на сервере получить сразу массив.

laimas 19.06.2020 06:03

Не заметил добавленного.

На каком сервере это исполняется, на удаленном или локальном? Учтите, вываливать ошибки на удаленном сервере не стоит, это почва для анализа не только для вас будет.

Notice: Undefined index ... это не ошибка, а предупреждение, что индекс q не определен в массиве $_POST, а неопределенное это null, следовательно и на выводе ничего не будет. На удаленном сервере вывод предупреждений подавляется, а ошибки пишут в лог файлы.

Параметры подключения к базе, это не имя сервера, а host, он и на удаленном сервере может быть как localhost. На локальном сервере уже есть по умолчанию установки из ini-файла: server = localhost:3306, user = root, password = "". Для отладки этого и достаточно, а на удаленном параметры хоста вам определит хостер.

localStorage.setItem('user', JSON.stringify(data)); - здесь в локальное хранилище записывается строка которую возвращает JSON.stringify, и это потому, что нельзя в локальное хранилище записать объект, все что в хранилище, это строки - ключи и их значения.

data = JSON.parse(localStorage.getItem('user')); - это декодирование json из локального хранилища, после которого data будет объектом. Поэтому подставив его тут url: 'save.php?q='+data, и получим вывод save.php?q=[object Object]. Правильно было бы

data = localStorage.getItem('user');
//....
url: 'save.php?q='+data


Но в этом случае на сервер бы ушел json как GET параметр, а вы определяете метод передачи POST, ничего не передавая, какой смысл? Поэтому удаляем его из url и передаем как POST - data: {q: data}. А на сервере декодировать $data = json_decode($_POST['q']);

Можно определить для передачи и объект:

var data = JSON.parse(localStorage.getItem('user'));
//а в $.ajax данные
data: data,
//об остальном это забота JQ


В этом случае на сервере print_r($_POST) выдаст ассоциативный массив. Ниже представленный код сохраните под любым именем как php и запустите его. Сервер получит POST данные в массиве $_POST и выведет их в браузер.

<?php
if($_POST) exit(print_r($_POST, 1));
?>
<html>
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>
$(function() {
    //это объект
    var data = {"cod":"200","message":0,"cnt":40,"city":{"id":524901,"name":"Moscow","country":"RU","population":1000000,"timezone":10800,"sunrise":1592441057,"sunset":1592504230}};
    $.ajax({
        url: location,
        type: 'POST',
        data: data,
        success: function(d) {
            alert(d)
        }
    })
});
</script>
</head>
<body>

</body>
</html>


А у вас не работает потому, что вы в чем-то допускаете ошибки.


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