перевести ответ и запрос в PHP REST API - PullRequest
1 голос
/ 13 апреля 2020

Я все еще борюсь с логикой c, как правильно перевести ответ и запрос на мой PHP REST API. У меня есть следующий массив, который я получаю из REST API

[{
  "id": "49557a36-028b-40c6-b2d8-8095468af130",
  "startDate": "2020-04-15T06:00:00Z",
  "endDate": "2020-04-15T10:00:00Z",
  "bookedOn": "0001-01-01T00:00:00",
  "doctorNotes": "",
  "firstVisit": true,
  "visitReasonID": "",
  "patient": {
    "firstName": "",
    "lastName": "",
    "birthday": "0001-01-01T00:00:00",
    "gender": "x",
    "street": "",
    "postboxNumber": "",
    "city": "",
    "zip": "",
    "country": "",
    "email": "",
    "telephone": "",
    "info": ""
  }]

, с другой стороны, у меня также есть некоторые данные, которые я отправляю в REST API, и он выглядит так

array(8) {
  ["GUID"]=>
  NULL
  ["datumzeit_from"]=>
  string(19) "2020-03-13 13:30:00"
  ["datumzeit_till"]=>
  string(16) "2020/03/13 17:00"
  ["titel"]=>
  string(2) "61"
  ["beschreibung"]=>
  string(4) "okay"
  ["firstVisit"]=>
  bool(true)
  ["patient"]=>
  array(1) {
    [0]=>
    array(11) {
      ["vorname"]=>
      string(4) "John"
      ["nachname"]=>
      string(7) "Daniels"
      ["geburtsdatum"]=>
      string(10) "1970-01-01"
      ["titel"]=>
      string(4) "Herr"
      ["strasse"]=>
      string(15) "Danielstraße 3"
      ["ort"]=>
      string(6) "Conan"
      ["plz"]=>
      string(5) "93085"
      ["land"]=>
      string(2) "DE"
      ["email"]=>
      string(1) "1"
      ["telnr"]=>
      string(10) "0835597839"
      ["referenz"]=>
      string(3) "nothing"
    }
  }
  ["last_updated"]=>
  string(19) "2020-03-09 17:08:23"
}

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

<?php $exchangeArray = array( 
    "id" => "GUID",
    "startDate" => "datumzeit_from",
    "endDate" => "datumzeit_till", 
    "bookedOn" => "last_updated", 
    "doctorNotes" => "beschreibung",
    "firstVisit" => "firstVisit",
    //"visitReasonName" => "titel",
    "visitReasonID" => "visitreason_nr",
    "patient" => array(
        "firstName" => "vorname",
        "lastName" => "nachname",
        "birthday" => "geburtsdatum",
        "gender" => "titel", //anders
        "street" => "strasse",
        //"postboxnumber" => "",
        "city" => "ort", // ort id
        "zip" => "plz",
        "country" => "land", 
        "email" => "email",
        "telephone" => "telnr",
        "info" => "referenz"),
); ?>

Теперь к моей главной проблеме: всегда, когда я отправляю или хочу получать данные, я всегда хочу перевести их между моей базой данных и REST. API и я в точности делаем следующее: $result = translate(json_decode($data, "IN"); //either json_decode+IN or encode+OUT, чтобы вызвать результат, я либо помещаю некоторые данные и отправляю их, либо декодирую и получаю их. Поэтому я в основном хочу изменить ключи и сохранить значения, так что вот узкое место

function sortVars($var, $iterKey, $iterVal, $i, $IN = TRUE){ //the main logic is here and also the issue in the algorithm, it sorts out the variables
    if(is_array($var)){
        foreach($iterVal as $x=>$y){
            if($IN == TRUE){
                if(isset($var[$x])) $transformed[$i][$iterKey][$var[$x]] = $y;
            } else if(isset($var[$y])) $transformed[$i][$iterKey][$var[$y]] = $x;   
        }
    } else $transformed[$i][$var] = $iterVal;
return $transformed;
}   
function transSort($data, $stat, $i=0){ //that one sorts out the whole array
    global $exchangeArray;
    if($stat == "IN"){
        foreach($data as $kay=>$val){
            if(isset($exchangeArray[$kay])){
                $transformed[] = sortVars($exchangeArray[$kay], $kay, $val, $i);
            }       
        }
    } elseif($stat == "OUT"){
        foreach($exchangeArray as $kay=>$val){
            if(!is_array($val)){
                if(isset($data[$val])) $transformed = sortVars($data[$val], $val, $kay, $i, FALSE);
            } else{ //for strange reason its array with 0 in the beginning
                if(isset($data[0][$val])) $transformed = sortVars($data[$val], $val, $kay, $i, FALSE);
            }
        }
    }
    $i++;
    return $transformed;
}
function translate($data, $stat){ //translate response
    $i=0;
    if(isset($data[1])){ //if its array
        foreach($data as $key){
            $result = transSort($key, $stat, $i++);
        }
    } else $result = transSort($data, $stat);

    return $result;
}

Он перебирает массивы и в зависимости от $stat преобразует их либо в запрос, либо в ответ, но не переводит правильно и до сих пор у меня много проблем, у меня раньше была только одна функция, и $stat=IN работал отлично, но как только я создал больше функций, чтобы было меньше кода, у него начались проблемы, а также у $stat=OUT были некоторые проблемы с логикой c относительно правильного перевода Кто-нибудь имеет представление, что является главной проблемой в следующем коде?

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Я думаю, что есть немного более простой способ

1) Создать функцию для переключения немецкого => с английского на английский => немецкий

function array_flip_recursive($array) {

    $out = [];

    foreach ($array as $k => $v) {

        if (is_array($v)) {

            $out[$k] = array_flip_recursive($v);

        } else {

            $out[$v] = $k;

        }

    }

    return $out;

}

2) Замените ключи переведенной версией

function translate($data, $dictionary, $flip = false) {

    if ($flip) $dictionary = array_flip_recursive($dictionary);

    $out = [];

    foreach ($data as $k => $v) {

        if (is_array($v)) {

            $out[$k] = translate($v, $dictionary[$k], $flip);

        } else {

            $out[$dictionary[$k]] = $v;

        }

    }

    return $out;

}

Эта функция будет принимать либо вывод вашей базы данных, либо вывод API и $exchangeArray из вашего предыдущего кода. Переменная $flip предназначена для преобразования немецкого языка обратно в английский sh.

Обратите внимание, что вам потребуется json_decode($api_output, true) ваш выход API, чтобы преобразовать его в ассоциативный массив. В качестве примера вы привели массив данных, поэтому вам понадобится l oop поверх него:

3) Обработать ваши данные

//From the API
foreach(json_decode($api_output, true) as $api_data) {

    $myData[] = translate($api_data, $exchangeArray);

}

print_r($myData);

//From your database
foreach($database_output as $database_data) {

     $myData[] = translate($database_data, $exchangeArray, true);

}

print_r($myData);
2 голосов
/ 13 апреля 2020

Я часто сталкиваюсь со случаями, когда мне нужно преобразовать что-то из модели A в модель B (независимо от перевода).

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

  1. Легче видеть, что происходит
  2. Более простой код
  3. Не каждый преобразование легко express. Это может привести к усложнению вашей «системы конверсии» с течением времени, и это может быть очень болезненным. Конфигурация может в какой-то момент конкурировать, если вы только что написали код. Как видите, его уже довольно сложно и сложно отлаживать.

Так что, если бы это был я, я бы написал небольшие функции преобразования для каждого случая:

function toGerman($input) {

  return [
    "datumzeit_from" => $input['startDate'],
    // every other property
  ];

}

Я заметил что написание функции вместо системы конфигурации + сопоставления противоречит природе многих разработчиков, но легко понять, насколько это может быть проще и гибче. Это просто PHP! Вы можете использовать петли и иметь дело со странными крайними случаями. Вместо этого вы написали небольшой транспорлер.

К сожалению, вы, возможно, не сочтете это реальным ответом на свой вопрос, поэтому я с удовольствием удалю этот ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...