Php добавить ключевое значение в ассоциативный массив в предварительном цикле

#php #arrays #json

#php #массивы #json

Вопрос:

Я получаю данные json из конечной точки api, я хотел бы добавить ключевое значение в массив, который я получаю. Это моя функция:

         $magazines = Magazine::all();

        foreach ($magazines as $magazine) {
          $result = file_get_contents('http://customer.pages.com/?customer=' . $magazine->visio_link_prefix . 'amp;action=latest');
          $issues[] = json_decode($result, true);
        }

        foreach ($issues as $issue) {
            Issue::create([
              ''
              'title' => $issue['papers'][0]['title'],
              'date' => $issue['papers'][0]['date'],
              'foldername' => $issue['papers'][0]['foldername'],
              'thumb' => $issue['papers'][0]['thumb'],
              'thumbmedium' => $issue['papers'][0]['thumbmedium'],
            ]);
        }
  

Массив, который я получаю от конечной точки, выглядит следующим образом:

 array:24 [▼
  0 => array:1 [▼
    "papers" => array:1 [▼
      0 => array:11 [▼
        "title" => "News- 2014-10-22"
        "date" => "2014-10-22"
        "expires" => ""
        "catalog" => 24
        "foldername" => "News"
        "folder" => 4965
        "pages" => 132
        "sectionstarts" => "1"
        "sectioncount" => 1
        "thumb" => "www.customer.pages.com/news/24/teasers/small.jpg"
        "thumb_medium" => "www.customer.pages.com/news/24/teasers/medium.jpg"
      ]
    ]
  ]
  1 => array:1 [▶]
  2 => array:1 [▶]
  3 => array:1 [▶]
  4 => array:1 [▶]
  5 => array:1 [▶]
  6 => array:1 [▶]
  7 => array:1 [▶]
  8 => array:1 [▶]
  9 => array:1 [▶]
  10 => array:1 [▶]
  11 => array:1 [▶]
  12 => array:1 [▶]
  13 => array:1 [▶]
  14 => array:1 [▶]
  15 => array:1 [▶]
  16 => array:1 [▶]
  17 => array:1 [▶]
  18 => array:1 [▶]
  19 => array:1 [▶]
  20 => array:1 [▶]
  21 => array:1 [▶]
  22 => array:1 [▶]
  23 => array:1 [▶]
]
  

Итак, в моем цикле foreach я хотел бы добавить пару ключевых значений 'magazineId' => $magazine->id к каждому из вышеупомянутых 'papers' массивов. Чтобы позже я мог использовать $issue['papers'][0]['magazineId'] для получения значения $magazine->id . Не уверен, как это сделать?

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

1. Пожалуйста, отредактируйте дамп из конечной точки, потому что это неверно. Это дамп $issues . Дамп конечной точки будет выглядеть примерно так: массив (размер = 1) ‘papers’ => массив (размер = 1) 0 => массив (размер = 11) ‘title’ => строка ‘Mamma- 2014-10-22’ (длина = 17) ‘date’ => строка ‘2014-10-22’ (длина = 10) ‘expires’ => строка » (длина = 0) ‘catalog’ => int 24 …

Ответ №1:

Это исправление к вашему коду должно сработать:

     foreach ($magazines as $magazine) {
        $result = file_get_contents('http://customer.pages.com/?customer=' . $magazine->visio_link_prefix . 'amp;action=latest');
        $issue = json_decode($result, true);

        foreach($issue['papers'] as $paperKey => $paper) {
            $issue['papers'][$paperKey]['magazineId'] = $magazine->id;
        }
        $issues[] = $issue;
    }

    foreach ($issues as $issue) {
        Issue::create([
          'magazineId' => $issue['papers'][0]['magazineId'],
          'title' => $issue['papers'][0]['title'],
          'date' => $issue['papers'][0]['date'],
          'foldername' => $issue['papers'][0]['foldername'],
          'thumb' => $issue['papers'][0]['thumb'],
          'thumbmedium' => $issue['papers'][0]['thumbmedium'],
        ]);
    }
  

И вторая версия, в которой у вас есть только один ключ magazineId для одного выпуска:

 foreach ($magazines as $magazine) {
    $result = file_get_contents('http://customer.pages.com/?customer=' . $magazine->visio_link_prefix . 'amp;action=latest');
    $issue = json_decode($result, true);
    $issue['magazineId'] = $magazine->id;
    $issues[] = $issue;
}
  

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

1. Я получаю неопределенный индекс: papers для первой части вашего ответа, а для второй части I magazine-> id не находится внутри массива papers

2. Не могли бы вы предоставить var_dump для $issue сразу после $issue = json_decode($result, true);

3. array (size=1) 'papers' => array (size=1) 0 => array (size=11) 'title' => string 'Mamma- 2014-10-22' (length=17) 'date' => string '2014-10-22' (length=10) 'expires' => string '' (length=0) 'catalog' => int 24 ...

Ответ №2:

Не могли бы вы, пожалуйста, попробовать код ниже? В первом foreach я добавил массив в $issue.

 $magazines = Magazine::all();

foreach ($magazines as $magazine) {
   $result = file_get_contents('http://customer.pages.com/?customer=' . $magazine->visio_link_prefix . 'amp;action=latest');
   $issues[] = array('magazine_id' => $magazine->id, 'result' => json_decode($result, true);
}

foreach ($issues as $issue) {
    Issue::create([
      'magazine_id' => $issue['magazine_id'],
      'title' => $issue['result']['papers'][0]['title'],
      'date' => $issue['result']['papers'][0]['date'],
      'foldername' => $issue['result']['papers'][0]['foldername'],
      'thumb' => $issue['result']['papers'][0]['thumb'],
      'thumbmedium' => $issue['result']['papers'][0]['thumbmedium'],
    ]);
}
  

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

1. Затем я получаю такой массив, 0 => array:2 [▼ "magazineId" => 6 0 => array:1 [▼ "papers" => array:1 [▼ 0 => array:11 [▼ ...rest of the array ] ] ] который я хотел бы поместить magazine id внутрь papers массива, если это возможно

2. Привет, @Marco; первый блок кода @krasipenkov может вам подойти. Вы пробовали это?