在PHP REST API中转换响应和请求

Sparkm4n

我仍在为如何正确转换对我的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遇到问题,并且在正确翻译方面存在一些逻辑问题,是否有人知道以下代码中的主要问题是什么?

f

我认为有一种更简单的方法

1)创建一个函数以将德语=> Eng翻转为Eng =>德语

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变量是为了防止您将德语转换回英语。

请注意,您将需要将json_decode($api_output, true)API输出转换为关联数组。您给出的示例是一个数据数组,因此您需要对其进行循环:

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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章