【问题标题】:Renaming object keys name in PHP Laravel在 PHP Laravel 中重命名对象键名
【发布时间】:2019-08-06 08:56:14
【问题描述】:

我有一个 JSON 请求,我需要更改模型对象键上所有相似的对象键名称,我在嵌套数组对象方面遇到困难,并且点符号在这部分不起作用。

这是我的验证请求代码:

<?php

namespace App\Http\Requests\Api\Nutmeg;

use Illuminate\Foundation\Http\FormRequest;

class WebhookValidation extends FormRequest
{

    protected $map = [
        'callback_url' => 'url',
        'tokenApi' => 'secret_token',
        'supplier' => 'agent',
        'supplier.*.key.*' => 'id',
        'supplier.*.number.*' => 'quantity'
    ];

    protected $jsonConvert;

    public function setJson($json)
    {
        foreach($this->map as $original => $new) {
            $json->set($new, $json->get($original));
            $json->remove($original);
        }
        $this->jsonConvert = $json;
    }

    public function validationData()
    {
        return $this->jsonConvert->all();
    }

    public function rules()
    {
        return [
            'url' => 'bail|required|url|unique:webhooks,url',
            'secret_token' => 'required',
            'agent.*.id' => 'required',
            'agent.*.quantity' => 'required'
        ];
    }

    public function messages()
    {
        return [
            'url.unique' => 'Url should be unique',
            'secret_token.required' => 'Secret token is required'
        ];
    }
}

这是 JSON 请求:

{
      "callback_url": "https://www.gosdoddgle.com",
      "tokenApi": "stringstrinngstringstring",
      "supplier": [
            {
                "key": "sdsds1",
                "number": "sdsds1"
            },
            {
                "key": "sdsds1",
                "number": "sdsds1"
            }
        ]
}

我希望它是这样的:

{
      "url": "https://www.gosdoddgle.com",
      "secret_token": "stringstrinngstringstring",
      "agent": [
            {
                "id": "sdsds1",
                "quantity": "sdsds1"
            },
            {
                "id": "sdsds1",
                "quantity": "sdsds1"
            }
        ]
}

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    使用新键解码为数组和数组组合。
    然后循环“代理”并再次用 array_combine 替换键。

    $arr = json_decode($json, true);
    $mainkeys = ["url", "secret_token", "agent"];
    $subkeys = ["id", "quantity"];
    
    $arr = array_combine(array_slice($mainkeys,0,count($arr)), $arr);
    
    if(isset($arr["agent"])){
        foreach($arr["agent"] as &$val){
            $val = array_combine($subkeys, $val);
        }
    }
    unset($val); 
    

    https://3v4l.org/mKePQ

    array(3) {
      ["url"]=>
      string(26) "https://www.gosdoddgle.com"
      ["secret_token"]=>
      string(25) "stringstrinngstringstring"
      ["agent"]=>
      array(2) {
        [0]=>
        array(2) {
          ["id"]=>
          string(6) "sdsds1"
          ["quantity"]=>
          string(6) "sdsds1"
        }
        [1]=>
        &array(2) {
          ["id"]=>
          string(6) "sdsds1"
          ["quantity"]=>
          string(6) "sdsds1"
        }
      }
    }
    

    【讨论】:

    • 非常感谢您的回答,但是我还有一个问题,在json请求中,可能不需要供应商密钥,需要一个条件来知道供应商是否存在。
    • 查看编辑。在 $arr 的计数处对键数组进行切片
    • 非常感谢您的回答,我对这个回答非常有启发。上帝保佑先生 :-) @Andreas
    • @BricxJ.Carasco 随意采纳答案,让大家看到问题已经解决
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    相关资源
    最近更新 更多