首页 > 解决方案 > 使用 PHP 将值插入 JSON 对象

问题描述

我正在尝试编写一个脚本,该脚本允许定义表单字段并基于此编写 JSON 模式。

{
   "createContact":{
      "method":"POST",
      "sobject":"Contact",
      "Intangible\/Event.payload":{
         "FirstName":"contact_first_name",
         "LastName":"contact_last_name",
         "MobilePhone":"contact_phone",
         "HomePhone":"contact_phone",
         "npe01__PreferredPhone__c":"Mobile",
         "MailingStreet":"address_unit_no",
         "MailingCity":"address_suburb",
         "MailingState":"address_state",
         "MailingPostalCode":"address_postcode",
         "MailingCountry":"address_country",
         "npe01__HomeEmail__c":"contact_email",
         "npe01__Preferred_Email__c":"Personal",
         "Stripe_Customer_ID__c":"stripe_customer_id"
      }
   },
   "createOpportunity":{
      "method":"POST",
      "sobject":"Opportunity",
      "Intangible\/Event.payload":{
         "StageName":"stage_name",
         "Type":"donation_type",
         "Amount":"donation_amount",
         "PD_Payment_Method__c":"Web",
         "CampaignId":"campaign_id",
         "RecordTypeId":"record_id",
         "Name":"opportunity_name",
         "CloseDate":"date",
         "Description":"description",
         "Stripe_Card_ID__c":"stripe_card",
      }
   }
}

我已经设置了虚拟值,我想从表单输入中替换这些值。还有某些字段,例如 Stripe_Customer_ID__c 等,需要在成功交易后从 Stripe 填充。

我尝试将 JSON 对象转换为 PHP 对象,然后使用 foreach 循环填充这些值,但是由于某些字段不是表单的一部分,因此证明有点挑战性。我希望能够重用代码,以便如果用户更改架构和表单字段,代码仍然会选择它并添加正确的值。

例如,如果Stripe_Card_ID__c更改为Stripe_Card__c我希望代码能够获取并分配正确的值。

我想知道是否有一种更简单的方法来处理映射,而不使用 foreach 循环来处理不确定的数据。

我目前写的代码

foreach($mapping as $mapping_key => $mapping_event){
            if(is_object($mapping_event)){
                foreach($mapping_event as $key => $value){
                    if(is_object($value)){
                        foreach($value as $inner_key => $inner_value){ 
                            if(isset($data[$inner_value])){
                                $event[$mapping_key][$key][$inner_key] = (string)$data[$inner_value];
                            }else{
                                $event[$mapping_key][$key][$inner_key] = $inner_value;
                            }
                        }
                    }else{
                        $event[$mapping_key][$key] = $value;

                        if($value == 'query'){
                            $event[$mapping_key][$key] = "";
                        }
                    }
                }
            }else{
                $event[$mapping_key] = $mapping_event;
            }
        }

这确实会输出它从表单中提取的某些字段,但是每个 Salesforce 帐户的更独特的字段是硬位。

array(4) {
  ["createContact"]=>
  array(3) {
    ["method"]=>
    string(4) "POST"
    ["sobject"]=>
    string(7) "Contact"
    ["Intangible/Event.payload"]=>
    array(13) {
      ["FirstName"]=>
      string(3) "asd"
      ["LastName"]=>
      string(3) "asd"
      ["MobilePhone"]=>
      string(13) "contact_phone"
      ["HomePhone"]=>
      string(13) "contact_phone"
      ["npe01__PreferredPhone__c"]=>
      string(6) "Mobile"
      ["MailingStreet"]=>
      string(36) "address_unit_no"
      ["MailingCity"]=>
      string(3) "asd"
      ["MailingState"]=>
      string(3) "asd"
      ["MailingPostalCode"]=>
      string(3) "asd"
      ["MailingCountry"]=>
      string(2) "AF"
      ["npe01__HomeEmail__c"]=>
      string(11) "asd@asd.asd"
      ["npe01__Preferred_Email__c"]=>
      string(8) "Personal"
      ["Stripe_Customer_ID__c"]=>
      string(18) "stripe_customer_id"
    }
  }
  ["createOpportunity"]=>
  array(3) {
    ["method"]=>
    string(4) "POST"
    ["sobject"]=>
    string(11) "Opportunity"
    ["Intangible/Event.payload"]=>
    array(13) {
      ["StageName"]=>
      string(10) "stage_name"
      ["Type"]=>
      string(4) "once"
      ["Amount"]=>
      string(2) "52"
      ["PD_Payment_Method__c"]=>
      string(3) "Web"
      ["CampaignId"]=>
      string(11) "campaign_id"
      ["RecordTypeId"]=>
      string(9) "record_id"
      ["Name"]=>
      string(16) "opportunity_name"
      ["CloseDate"]=>
      string(4) "date"
      ["Description"]=>
      string(11) "description"
      ["Platform_Donation_ID__c "]=>
      string(0) ""
      ["Stripe_Card_ID__c"]=>
      string(11) "stripe_card"
      ["Stripe_Fingerprint__c "]=>
      string(18) "stripe_fingerprint"
      ["Conga_Trigger__c"]=>
      string(13) "conga_trigger"
    }
  }
......
}

如您所见,上述结果仅具有已替换的某些字段。

标签: phparraysjson

解决方案


我最终单独管理每个阵列。鉴于领域的差异,我发现这更容易。我必须硬编码的某些字段可能会在其他时间查看,但初稿可以正常工作,这是个好消息。


推荐阅读