PHP, cURL, REST-API - ПОСТАВИТЬ переменную со многими значениями в массив JSON

со следующим кодом

<?php
                //PHP Infos anzeigen lassen
            //phpinfo();
          header('Content-type: text/html; charset=utf-8');
            // Inhaltstyp und Zeichenkodierung für Skript festlegen
                $User_Agent = 'Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0';

            $id = $_POST["id"];             
                // Übernahme Formulareingabe
                $url = "http://hub.culturegraph.org/entityfacts/$id";
                // URL festlegen

                $request_headers[] = 'Accept: application/json';
              $request_headers[] = 'Content-Type: application/json; charset=utf-8';
              $request_headers[] = 'Accept-Encoding:    gzip, deflate, identity';
              $request_headers[] = 'Accept-Language: de,en-US;q=0.7,en;q=0.3';
              $request_headers[] = 'X-picturemaxx-api-key: key';
                $request_headers[] = "Authorization: Bearer token";
            // Optionale Anfrageoptimierungen

              $ch = curl_init($url);
              //  Initiate curl
        curl_setopt($ch, CURLOPT_USERAGENT, $User_Agent);
                curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_ENCODING, "");
                // Anfrage optimieren
                // Execute
                $result = curl_exec($ch); // Performs the Request, with specified curl_setopt() options (if any).
        curl_close($ch);
        // Closing

        $data = json_decode($result, true); // Dekodiert eine JSON-Zeichenkette, Übergibt an Variable
        foreach($data['variantName'] as $alternativ) {
        echo $alternativ . " ; ";

}

я получаю json-данные. Результат переменной $ alternativ выглядит так:

"Иоганн Вольфганг Гете; Йохан Вольфганг фон Гете; Йохан Вольфганг Гете; Йохан В. фон Гете; Йохан Вольфг. Против Гете; Й. Вольфганг Гете; JW против Гете; JW Гете; Ян Вольфганг Гете; Жан Вольфганг фон Гете; Хуан Вольфганг фон Гете; Хуан Вольфганг Гете; Хуан В. Гете; Иоанн Вольфганг фон Гете; Иоанн Вольфганг Гете; Иоанн Вольфганг Гете; Иоаннес В. Гете; И. В. Гете; Вольфганго Гете; Вольфанго Гете; В. фон Гете; В. фон Гете; Гете; Джованни Л. Гете; Г. Л. Гете; Гете;

и так далее.

Затем я пытаюсь ПОСТАВИТЬ значения переменной $ alternativ в поле json-array / database 'имя_элемента_классификации'

$url2 = "https://bpk.bs.picturemaxx.com/api/v1/editing/classifications/42/elements/2156013";



$dataj = array (
  'classification_element_parent_id' => 0,
  'classification_element_matchcode' => '',
  'classification_element_foreignref' => '',
  'localized' => 
  array (
    'en-us' => 
    array (
      'classification_element_name' => '',
    ),
    'de-de' => 
    array (
      'classification_element_name' => $alternativ,
    ),
  ),
);

        $data_json = json_encode($dataj);

              $ch = curl_init($url2);
              // Set the url
        curl_setopt( $ch, CURLOPT_URL, $url2 );
        curl_setopt($ch, CURLOPT_USERAGENT, $User_Agent);
                curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
        curl_setopt($ch, CURLOPT_ENCODING, "");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data_json);

                // Execute
                $result2 = curl_exec($ch); // Performs the Request, with specified curl_setopt() options (if any).
                $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
                // Closing
        curl_close($ch);

Это работает. Но в поле базы данных появляется только одно, соответственно, последнее значение из множества значений переменной $ alternativ. Как изменить код, чтобы все значения переменной $ alternativ передавались в поле базы данных?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вы просто зацикливаете и повторяете элементы и не назначаете их переменной

foreach($data['variantName'] as $alternativ) {
    echo $alternativ . " ; ";
}

$ alternativ всегда будет последним элементом $ data ['optionName']. Вам нужно заменить $ alternativ на $ data ['optionName'] в вашем массиве $ dataj или назначьте новую переменную и используйте ее в своем массиве $ dataj

например:

$alternativData = array();
foreach($data['variantName'] as $alternativ) {
    echo $alternativ . " ; ";
    $alternativData[] = $alternativ;
}

$dataj = array (
  'classification_element_parent_id' => 0,
  'classification_element_matchcode' => '',
  'classification_element_foreignref' => '',
  'localized' => 
  array (
    'en-us' => 
    array (
      'classification_element_name' => '',
    ),
    'de-de' => 
    array (
      'classification_element_name' => $alternativData,
    ),
  ),
);

или если он должен выглядеть как «данные1; данные2; данные3 ..» муза:

$alternativData = array();
foreach($data['variantName'] as $alternativ) {
    echo $alternativ . " ; ";
    $alternativData[] = $alternativ;
}

$dataj = array (
  'classification_element_parent_id' => 0,
  'classification_element_matchcode' => '',
  'classification_element_foreignref' => '',
  'localized' => 
  array (
    'en-us' => 
    array (
      'classification_element_name' => '',
    ),
    'de-de' => 
    array (
      'classification_element_name' => implode(';', $alternativData),
    ),
  ),
);

Привет, PHPunk. Извините, что не работает. Для первого решения все, что я получаю, это «Массив» в поле базы данных. А по второй идее я ничего не получаю.

SIB 12.10.2018 15:00

о, у меня есть типаж, извини. i, снова отредактирую код.

PHPunk 12.10.2018 15:22

попробуйте еще раз, пожалуйста :)

PHPunk 12.10.2018 15:23

Я уже заметил орфографическую ошибку и исправил ее. После этого я получаю только пустое поле базы данных. никакие ценности не принимаются.

SIB 12.10.2018 15:31

вы можете сделать print_r ($ alternativData); и print_r ($ dataj); и выложить?

PHPunk 12.10.2018 15:43

print_r ($ alternativData); возвращает: Array ([0] => Johann Wolfgang Goethe [1] => Johan Wolfgang von Goethe [2] => Johan Wolphgang Goethe [3] => Johan W. von Goethe [4] => Joh. Wolfg. v. Гете [5] => Й. Вольфганг Гете [6] => И. В. против Гете [7] => И. В. Гете [8] => Ян Вольфганг Гете [9] => Жан Вольфганг фон Гете [10] => Хуан Вольфганг фон Гете [11] => Хуан Вольфганг Гете [12] => Хуан В. Гете

SIB 12.10.2018 15:52

print_r ($ dataj); возвращает: Массив ([classification_element_parent_id] => 0 [классификационный_элемент_matchcode] => [classification_element_foreignref] => [localized] => Array ([en-us] => Array ([class_element_name] =>) [de-de] => Array ([имя_элемента_классификации] => Массив ([0] => Иоганн Вольфганг Гете

SIB 12.10.2018 15:53

хорошо, это правильно, все значения находятся в dataj / alternData. Попробуйте использовать implode ('', $ alternativ Data) вместо implode (';', $ alternativ Data)

PHPunk 12.10.2018 16:04

к сожалению, тоже не работает. снова пустое поле базы данных

SIB 12.10.2018 16:15

это работает, если вы установите значение manuel на «Иоганн Вольфганг Гете; Йохан Вольфганг фон Гете»? Может быть, есть максимальная длина входа? Если есть что-то вроде Göthe или J. Wolfgang göthe: «Вы должны попробовать utf8_decode / Закодировать вашу строку.

PHPunk 12.10.2018 16:23

Когда я устанавливаю значение manuel в поле «имя_класса_элемента», оно работает. я подумал с заголовком ('Content-type: text / html; charset = utf-8'); строка уже utf-8?

SIB 12.10.2018 16:38

команда header просто устанавливает заголовок для вашего браузера, а не для curl, но у вас установлены заголовки curl (ваш $ request_headers). Попробуйте и проверьте, будет ли работать часть полной строки [например: 'имя_элемента_классификации' => substr (implode ('', $ alternativData), 0, 20)] и / или работает ли utf8_decode / encode: )

PHPunk 12.10.2018 16:43

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

SIB 12.10.2018 16:51

Когда я устанавливаю substr (implode (';', $ alternativData), 0, 200), он работает. Но когда я устанавливаю substr (implode (';', $ alternativData), 0, 2000), это не работает.

SIB 12.10.2018 16:55

как мне добавить utf8_decode / encode в substr (implode (';', $ alternativData), 0, 2000)?

SIB 12.10.2018 16:57

Я могу делать это до substr (implode (';', $ alternativData), 0, 765). после этого больше не работает. Почему так? Возможно ли, что поле базы данных ограничено этим количеством символов?

SIB 12.10.2018 17:41

привет еще раз, есть две возможные проблемы. первый: ограничение на количество символов в поле db (765 было бы странным пределом). второй: неправильная кодировка. попробуйте utf8_decode (implode (';', $ AlternativeData)) или utf8_encode (implode (';', $ AlternativeData));

PHPunk 13.10.2018 11:08

Привет. извините, но это тоже не работает. даже если я снова дам ему числа. также, если я попытаюсь напечатать символы из substr (implode (';', $ alternativData), 765, 800), поле базы данных останется пустым. пока действительно работает только substr (implode (';', $ alternativData), 0, 765).

SIB 15.10.2018 09:55

Хорошо, я нашел проблему. Я забыл установить заголовок «Ожидайте:»; и "'Content-Length:'. strlen ($ data_json)". Пояснение можно найти здесь: stackoverflow.com/questions/9120760/…. Таким образом, версия с «'имя_элемента_классификации' => substr (implode (';', $ alternativData), 0, 10000),» работает!

SIB 17.10.2018 12:22

Другие вопросы по теме