PHP Loop через JSON для создания нового массива - PullRequest
0 голосов
/ 26 июня 2019

Я не уверен, почему мне так тяжело с этим, но у меня есть декодированный JSON, и я хочу пройтись по нему, чтобы создать меньший массив, используя некоторые данные.

Ниже мой JSON $jsonData:

{
  "resultsPage": {
    "results": {
      "event": [
        {
          "id":11129128,
          "type":"Concert",
          "uri":"http://www.songkick.com/concerts/11129128-wild-flag-at-fillmore?utm_source=PARTNER_ID&utm_medium=partner",
          "displayName":"Wild Flag at The Fillmore (April 18, 2012)",
          "start": {
            "time":"20:00:00",
            "date":"2012-04-18",
            "datetime":"2012-04-18T20:00:00-0800"
          },
       location": {
            "city":"Chicago, IL, US",
            "lng":-134.903409,
            "lat":37.7842398
          },
          "venue": {
            "id":6239,
            "displayName":"The Fillmore",
            "uri":"http://www.songkick.com/venues/6239-fillmore?utm_source=PARTNER_ID&utm_medium=partner",
            "lng":-122.4332937,
            "lat":37.7842398,
            "metroArea": {
              "id":26330,
              "uri":"http://www.songkick.com/metro_areas/26330-us-sf-bay-area?utm_source=PARTNER_ID&utm_medium=partner",
              "displayName":"SF Bay Area",
              "country": { "displayName":"US" },
              "state": { "displayName":"CA" }
            }
          },
          "status":"ok",
          "popularity":0.012763
        },
        {
          "id":7923094,
          "type":"Concert",
          "uri":"http://www.songkick.com/concerts/11129128-wild-flag-at-fillmore?utm_source=PARTNER_ID&utm_medium=partner",
          "displayName":"Wild Flag at The Fillmore (April 18, 2012)",
          "start": {
            "time":"20:00:00",
            "date":"2012-04-18",
            "datetime":"2012-04-18T20:00:00-0800"
          },
       location": {
            "city":"New York, NY, US",
            "lng":63.902374,
            "lat":49.7842328
          },
          "venue": {
            "id":6239,
            "displayName":"The Fillmore",
            "uri":"http://www.songkick.com/venues/6239-fillmore?utm_source=PARTNER_ID&utm_medium=partner",
            "lng":-122.4332937,
            "lat":37.7842398,
            "metroArea": {
              "id":26330,
              "uri":"http://www.songkick.com/metro_areas/26330-us-sf-bay-area?utm_source=PARTNER_ID&utm_medium=partner",
              "displayName":"SF Bay Area",
              "country": { "displayName":"US" },
              "state": { "displayName":"CA" }
            }
          },
          "status":"ok",
          "popularity":0.012763
        },

        {
          "id":89763146,
          "type":"Concert",
          "uri":"http://www.songkick.com/concerts/11129128-wild-flag-at-fillmore?utm_source=PARTNER_ID&utm_medium=partner",
          "displayName":"Wild Flag at The Fillmore (April 18, 2012)",
          "start": {
            "time":"20:00:00",
            "date":"2012-04-18",
            "datetime":"2012-04-18T20:00:00-0800"
          },
       location": {
            "city":"Miami, FL, US",
            "lng":42.1238243,
            "lat":50.7289731
          },
          "venue": {
            "id":6239,
            "displayName":"The Fillmore",
            "uri":"http://www.songkick.com/venues/6239-fillmore?utm_source=PARTNER_ID&utm_medium=partner",
            "lng":-122.4332937,
            "lat":37.7842398,
            "metroArea": {
              "id":26330,
              "uri":"http://www.songkick.com/metro_areas/26330-us-sf-bay-area?utm_source=PARTNER_ID&utm_medium=partner",
              "displayName":"SF Bay Area",
              "country": { "displayName":"US" },
              "state": { "displayName":"CA" }
            }
          },
          "status":"ok",
          "popularity":0.012763
        }
      ]
    },
    "totalEntries":24,
    "perPage":50,
    "page":1,
    "status":"ok"
  }
}

Ниже приведена моя первая попытка перебрать переменную JSON и разобрать нужные данные в новый массив. Я не уверен, стоит ли мне использовать push или есть более эффективный способ разбора нужных мне данных в новый массив:

$newArray = array();

foreach($jsonData['resultsPage']['results']['event'] as $val){

$newArray .= "{'id' => $val['id'], 'long' => $val['location']['lng'], 'lat' => $val['location']['lat']}"

}

Ответы [ 3 ]

3 голосов
/ 26 июня 2019

Попробуйте это:

$jsondata_array = json_decode($jsonData, true);

$new_required_arr = $jsondata_array['resultsPage']['results']['event'];

foreach($new_required_arr as $key => $val)
{
  //Your logic to create new array with required key value pair.
}
1 голос
/ 26 июня 2019

Проблема с циклом you состоит в том, что когда элемент не существует, вы получаете ошибку, потому что вы пытаетесь получить доступ к элементу в вашем массиве, который не существует.

foreach($jsonData as $val) {
}

Тогда вы можете работать со своими значениями, и вам следует проверить их с помощью isset. Или вы делаете оператор if вокруг вашего цикла, чтобы предотвратить эту проблему.

Следующая проблема заключается в том, что вы определяете $newArray как массив. Но . должен объединить строку. Таким образом, вы должны определить свою начальную переменную следующим образом:

$newArray = '';

Последнее, что я не вижу в вашем коде, но для разбора строки json вы должны сначала использовать json_decode. Чтобы получить объект. Если вы хотите массив, вы должны установить второй параметр на true.

$arr = json_decode($myjson, true);
1 голос
/ 26 июня 2019

Указан неверный формат JSON, в индексе location отсутствует двойная кавычка в начале.

Чтобы проанализировать JSON, вы можете преобразовать JSON в массив и циклически перебрать массив, чтобы применить свою логику ИЛИ построить новый массив, вы можете использовать json_decode с параметром true.

$arr = json_decode($json, true);
foreach($arr as $k => $v){
  //Your logic
}
...