Преобразование возвращенных данных PHP в объект JavaScript

#javascript #php #json #chart.js2

#javascript #php #json #chart.js2

Вопрос:

У меня есть набор данных, который должен быть в том же формате, что и переменная JavaScript, как показано ниже:

 var theData = {
    datasets: [
        {
            label: "My First dataset",
            backgroundColor: "rgba(179,181,198,0.2)",
            borderColor: "rgba(179,181,198,1)",
            data: [65, 59, 90, 81, 56, 55, 40]
        },
        {
            label: "My Second dataset",
            backgroundColor: "rgba(255,99,132,0.2)",
            borderColor: "rgba(255,99,132,1)",
            data: [28, 48, 40, 19, 96, 27, 100]
        }
    ],
    labels: ["Eating", "Drinking", "Sleeping", "Designing", "Coding", "Cycling", "Running"]
};
  

Данные создаются на PHP, но я не могу получить их таким образом.

Вот что у меня есть в PHP (примерные данные, но тот же метод их заполнения):

 $data = array();

$data['datasets'][1]['label']           = "First Data Set";
$data['datasets'][1]['borderColor']     = "rgba(30, 87, 153, .9)";
$data['datasets'][1]['backgroundColor'] = "rgba(30, 87, 153, .5)";

$data['datasets'][2]['label']           = "Afternoon";
$data['datasets'][2]['borderColor']     = "rgba(41, 137, 216, .9)";
$data['datasets'][2]['backgroundColor'] = "rgba(41, 137, 216, .5)";

// Loop through some foreachs and fill the $data
// Not the actual loop I use but same principle

foreach ($theData as $data)
{
    $data['datasets'][1]['data'][] = data;
}

foreach ($otherData as $data)
{
    $data['datasets'][2]['data'][] = data;
}
  

Это возвращается обратно в JavaScript с помощью a json_encode(); когда я это делаю console.log(JSON.stringify(theData)) , я получаю это:

 {
    "datasets":{
        "1":{
            "label":"Morning",
            "borderColor":"rgba(125, 185, 232, .9)",
            "backgroundColor":"rgba(125, 185, 232, .5)",
            "borderWidth":1,
            "data":[
                "24",
                0,
                0,
                "30",
                "24",
                "36",
                "36"
            ]
        },
        "2":{
            "label":"Afternoon",
            "borderColor":"rgba(41, 137, 216, .9)",
            "backgroundColor":"rgba(41, 137, 216, .5)",
            "borderWidth":1,
            "data":[
                "24",
                0,
                0,
                "24",
                "24",
                "30",
                "36"
            ]
        }
    },
    "labels":[
        "Sun Aug 14",
        "Mon Aug 15",
        "Tue Aug 16",
        "Wed Aug 17",
        "Thu Aug 18",
        "Fri Aug 19",
        "Sat Aug 20"
    ]
}
  

Это для Chart.js 2.3. Образец данных сверху находится непосредственно из Chart.js примерные данные. Приведенный выше JSON — это мои результаты. Поскольку они не идентичны, диаграмма не работает. Могу ли я изменить свой PHP, чтобы сделать его более похожим на образец в самом верху?

Комментарии:

1. Почему вы не использовали json_encode ($data) в своем PHP

2. @KickingLettuce Было бы полезно, если бы вы создали массив обычным способом. $data['datasets'] = array(); $data['datasets'][] = array('label' => 'First Data Set', ...

3. Пожалуйста, сделайте. Это единственный способ убедиться, что полученные данные находятся в правильном формате JSON.

4. @Rishabh Извините, я что-то неправильно понял. Я использую его. Извините, что возвращаюсь к этому вопросу.

5. Ответ @Machavity правильный

Ответ №1:

Давайте начнем с самого начала

  • theData является ли object
  • datasets является array ли objects
  • labels является ли array

Итак, давайте приступим к созданию этого

 $data = array();
$data['datasets'] = array();
$data['datasets'][] = array("label" => "First Data Set",
     "borderColor" => "rgba(30, 87, 153, .9)",
     "backgroundColor" => "rgba(30, 87, 153, .5)"
     );
$data['datasets'][] = array("label" => "Second Data Set",
     "borderColor" => "rgba(41, 137, 216, .9)",
     "backgroundColor" => "rgba(41, 137, 216, .9)"
     );

$data['labels'] = array("Eating", "Drinking", "Sleeping", "Designing", "Coding", "Cycling", "Running");

echo json_encode($data);
  

Как уже упоминалось, json_encode выполняет всю работу за вас, как только вы создаете массив

 {
  "datasets": [
    {
      "label": "First Data Set",
      "borderColor": "rgba(30, 87, 153, .9)",
      "backgroundColor": "rgba(30, 87, 153, .5)"
    },
    {
      "label": "Second Data Set",
      "borderColor": "rgba(41, 137, 216, .9)",
      "backgroundColor": "rgba(41, 137, 216, .9)"
    }
  ],
  "labels": [
    "Eating",
    "Drinking",
    "Sleeping",
    "Designing",
    "Coding",
    "Cycling",
    "Running"
  ]
}
  

Комментарии:

1. да, его работа, я не видел такого массива в массиве, спасибо за разъяснение

2. Это выглядит как хороший способ сделать это, позвольте мне протестировать. Спасибо.

3. Я не понимаю, почему, если я устанавливаю свои ключи как `$data [‘datasets’] [1] , instead of $data [‘datasets’] [], вместо этого он преобразует его из массива объектов в объект объектов (по крайней мере, на основе способа JSON.stringify(theData) печати.)

4. @KickingLettuce Это из-за того, как должен работать JSON. Допустим, вы установили ключ 1 , но не ключ 0 . json_encode сохранит этот 1 ключ, преобразовав его в объект JSON. Помните, что в JS нет реальных ассоциативных массивов, подобных PHP