如何将 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);
}
我正在设置一个自动化程序,使用 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);
}