搜索多维数组并更改一个键的值

Search into multidimensional array and change value of one key

我有一个 json 包含多个数组的请求:

{
  "user_type": "2",
  "user_id": "57",
  "client_detail": [
    {
      "server_user_id": "1",
      ........
      ........
      "is_active": "1",
      "client_local_id": "11"
    },
    {
      "server_user_id": "2",
      ........
      ........
      "is_active": "1",
      "client_local_id": "12"
    }
  ], 
  }

使用上面的请求我将数据更改到数据库中。然后 return 来自数据库的数据。但我必须将 client_local_id 传递给响应。

所以假设我从数据库中得到了 3 个结果,那么我必须 return client_local_id(这个字段没有存储在数据库中,没有必要)和他们一起。所以我通过默认 client_local_id 0.

例如:

"client_detail": [
{
  "server_user_id": "1",
  ........
  ........
  "is_active": "1",
  "client_local_id": 0
},
{
  "server_user_id": "2",
  ........
  ........
  "is_active": "1",
  "client_local_id": 0
},
{
  "server_user_id": "3",
  ........
  ........
  "is_active": "1",
  "client_local_id": 0
},
]

然后使用下面的代码我更改 client_local_id 的值。

    $response = array('client_detail' => $dbvalue);
    /* Change Client Local ID */
    if(sizeof($client_detail_data)>0)
    {
        foreach($client_detail_data as $key=>$resclient_data)  // loop of request
        {
            foreach($response['client_detail'] as $key1=>$res_client)  //loop of response
            {
                //if id is match then change value
                if($res_client['server_user_id']==$resclient_data['server_user_id'])
                {
                    $response['client_detail'][$key1]['client_local_id'] = $resclient_data['client_local_id'];
                }
            }
        }
    }

但我认为有一个简单的方法可以做到这一点。我有一个请求中的多个数组,所以我不想使用太多的 foreach 循环。那么如何正确解决呢?

提前致谢。

首先让我们将 server_user_ids 映射到 client_user_ids:

$s2c = array();
foreach($resclient_data as $item) {
  $s2c[$item['server_user_id']] = $item['client_user_id'];
}

现在我们可以直接在$response上使用array_map:

$response['client_detail'] = array_map(function($elem) use($s2c) {
  $elem['client_local_id'] = $s2c[$elem['server_local_id']];
  return $elem;
}, $response['client_detail']);

我没有测试代码,但希望思路清晰。