如何将 XML 转换为关联数组并控制将哪些属性用作名称值对?

How can I convert XML to an associative array and control what attributes to use as the name value pairs?

我正在设置一个自动化程序,使用 API 上的 CURL 请求从 CRM 中提取客户信息。我返回的信息需要转换成一个数组并发送到我们的电子邮件平台。

当我发出初始 CURL 请求时,返回的 XML 是这样的:

<?xml version="1.0" encoding="utf-8"?>
<Leads>
 <Lead Id="1089686" LeadTitle="Student interested in Program" CreateDate="09/14/2018 19:52:28" ModifyDate="01/18/2019 08:37:07" ActionCount="7" LogCount="158" ReminderCount="0" ReadOnly="false" Flagged="false" LastDistributionDate="01/18/2019 08:37:07" LeadFormType="">
  <Campaign CampaignId="1253" CampaignTitle="Web Lead" />
  <Status StatusId="17" StatusTitle="Not Interested" />
  <Agent AgentId="11416" AgentName="user agent" AgentEmail="emails@email.com" GroupId="21" GroupName="group name">
   <AgentCustomFields custom1="" custom2="" custom3="" custom4="" />
  </Agent>
  <Fields>
   <Field FieldId="3" Value="email@email.com" FieldTitle="Email" FieldType="Email" />
   <Field FieldId="4" Value="Jon" FieldTitle="First Name" FieldType="Text" />
   <Field FieldId="5" Value="Doe" FieldTitle="Last Name" FieldType="Text" />
   <Field FieldId="11" Value="5554122222" FieldTitle="Mobile" FieldType="Phone" />
   <Field FieldId="105" Value="SensitiveURL.com" FieldTitle="Comments (Main)" FieldType="LongText" />
   <Field FieldId="117" Value="2002" FieldTitle="HS Grad Year" FieldType="Dropdown" />
   <Field FieldId="182" Value="Lack of Commitment" FieldTitle="Not Interested Reason" FieldType="ConditionalDropdown" />
   <Field FieldId="213" Value="Program" FieldTitle="Program of Interest" FieldType="ConditionalDropdown" />
   <Field FieldId="215" Value="text back - no not interested" FieldTitle="Comments (Nurture)" FieldType="LongText" />
   <Field FieldId="230" Value="Fort Myers" FieldTitle="Campus" FieldType="ConditionalDropdown" />
   <Field FieldId="276" Value="5554122222" FieldTitle="SMS Phone" FieldType="Phone" />
   <Field FieldId="291" Value="9/15/2018 10:09:12" FieldTitle="SMS Date Last Interacted" FieldType="DateTime" />
   <Field FieldId="292" Value="9/15/2018 10:09:12" FieldTitle="SMS Date Last Delivered" FieldType="DateTime" />
   <Field FieldId="295" Value="1" FieldTitle="SMS Delivered Count" FieldType="Number" />
   <Field FieldId="296" Value="False" FieldTitle="SMS Last Delivery Failed" FieldType="Checkbox" />
   <Field FieldId="297" Value="Long String" FieldTitle="SMS Last Delivered" FieldType="LongText" />
   <Field FieldId="299" Value="5554122222" FieldTitle="SMS Last Phone Delivered To" FieldType="Phone" />
  </Fields>
  <logs>
   <!-- a lot of superfluous information -->
  </logs>
 </Lead>
</Leads>

然后我使用 PHP 的这一点将其放入一个关联数组中,其中 $data[0] 是从 curl 请求返回的减去 headers:

$data   = simplexml_load_string( $data[0], 'SimpleXMLElement', LIBXML_COMPACT | LIBXML_PARSEHUGE );

我希望数组看起来像:

array = (
     'First Name' => 'Jon',
     'Last Name' => 'Doe',
)

但我得到的是:

array = (
     '4' => 'Jon',
     '5' => 'Doe'
)

所以我想知道如何控制名称值对的内容?这样,它不会设置一个数组,在其中获取 XML 中的第一个属性并将其指定为名称,而是查找我选择的属性来创建数组。

不确定如何获得当前输出,但通过 FieldTitle 属性提取数据和索引类似于...

$output = [];
foreach ( $data->Lead->Fields->Field as $field )  {
    $output[(string)$field['FieldTitle']] = (string)$field['Value'];
}

print_r($output);

确保将属性转换为字符串(使用 (string)),否则它们就是 SimpleXMLElements。

对于您的示例数据,这给出了..

Array
(
    [Email] => test@icloud.com
    [First Name] => Jon
    [Last Name] => Doe
    [Mobile] => 5554132121
)

如果有多个线索,那么您可能需要改变回路...

foreach ( $data->Lead as $lead )  {
    $output = [];
    foreach ( $lead->Fields->Field  as $field ) {
        $output[(string)$field['FieldTitle']] = (string)$field['Value'];
    }
    print_r($output);
}