【问题标题】:translate response and request in PHP REST API在 PHP REST API 中翻译响应和请求
【发布时间】:2020-04-13 16:29:17
【问题描述】:

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

【问题讨论】:

    标签: php json algorithm rest


    【解决方案1】:

    我认为有一个稍微简单的方法

    1) 创建一个函数来翻转德语 => Eng 到 Eng => German

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

    【讨论】:

    • 注意我也喜欢下面@Evert 回答的简单性
    • 不错的解决方案 =)
    • 经过测试,该案例的解决方案形状良好且不太复杂
    【解决方案2】:

    我经常遇到需要将模型 A 转换为模型 B 的情况(无论翻译如何)。

    我发现创建用于自动翻译的配置+系统几乎总是更容易。尽管打字有点多,但为每种情况创建一个函数也有一些优势:

    1. 更容易看到发生了什么
    2. 更简单的代码
    3. 并非每个转换都易于表达。这可能会使您的“转换系统”随着时间的推移变得越来越复杂,这可能会变得非常痛苦。如果您只是编写代码,配置可能会在某些时候与之竞争。如您所见,它已经相当复杂且难以调试。

    所以如果是我,我会为每种情况编写小的转换函数:

    function toGerman($input) {
    
      return [
        "datumzeit_from" => $input['startDate'],
        // every other property
      ];
    
    }
    

    我注意到编写函数而不是配置 + 映射系统与许多开发人员的天性背道而驰,但很容易看出这有多么容易和灵活。这只是 PHP !您可以使用循环并处理奇怪的边缘情况。相反,您编写了一个小转译器。

    很遗憾,您可能不认为这是您问题的真正答案,如果是这样,我很乐意删除此答案。

    【讨论】:

    • 我喜欢这个解决方案,但也提供了上面的代码答案,以防万一。
    • 这是一个很好的例子,可以解决始终可扩展的属性转换问题,就我而言,它只是一段动态且独特的代码,一旦工作就保持不变
    • @Sparkm4n 著名遗言 =)
    猜你喜欢
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2011-05-23
    相关资源
    最近更新 更多