PHP SimpleXML对象属性以数组形式存在,但直接访问时会变成对象
我在尝试解析Authorize.Net的CIM API的响应时遇到了一个奇怪的问题。PHP使用API的响应创建SimpleXML对象。对象的属性报告为数组(因为它包含两个唯一的索引),但是当直接访问该属性时,print_r()、gettype()和is_array()都将其报告/视为对象,而不是数组PHP SimpleXML对象属性以数组形式存在,但直接访问时会变成对象,php,arrays,object,simplexml,Php,Arrays,Object,Simplexml,我在尝试解析Authorize.Net的CIM API的响应时遇到了一个奇怪的问题。PHP使用API的响应创建SimpleXML对象。对象的属性报告为数组(因为它包含两个唯一的索引),但是当直接访问该属性时,print_r()、gettype()和is_array()都将其报告/视为对象,而不是数组 print_r($parsedresponse); foreach($profile as $prof){ print_r($prof); foreach($prof->pay
print_r($parsedresponse);
foreach($profile as $prof){
print_r($prof);
foreach($prof->paymentProfiles as $pProf){
print_r($pProf);
}
}
下面是PHP代码:
print_r($parsedresponse);
print_r($parsedresponse->profile);
print_r($parsedresponse->profile->paymentProfiles);
print_r($parsedresponse->profile->paymentProfiles[1])
生成以下输出:
SimpleXMLElement对象
(
[messages] => SimpleXMLElement Object
(
[resultCode] => Ok
[message] => SimpleXMLElement Object
(
[code] => I00001
[text] => Successful.
)
)
[profile] => SimpleXMLElement Object
(
[merchantCustomerId] => 1
[description] => Customer Profile for Store Code MC Created 11/20/13
[email] => email@email.com
[customerProfileId] => 11111111
[paymentProfiles] => Array
(
[0] => SimpleXMLElement Object
(
[customerType] => individual
[billTo] => SimpleXMLElement Object
(
[firstName] => Test
[lastName] => Test
[company] => Company Name
[address] => 1234 Test St
[city] => Testlyvania
[state] => OH
[zip] => 44720
[country] => United States
[phoneNumber] => 123-456-7890
[faxNumber] => SimpleXMLElement Object
(
)
)
[customerPaymentProfileId] => 22222222
[payment] => SimpleXMLElement Object
(
[creditCard] => SimpleXMLElement Object
(
[cardNumber] => XXXX1111
[expirationDate] => XXXX
)
)
)
[1] => SimpleXMLElement Object
(
[customerType] => individual
[billTo] => SimpleXMLElement Object
(
[firstName] => Test
[lastName] => Test
[company] => SimpleXMLElement Object
(
)
[address] => 1234 Test St
[city] => Testlyvania
[state] => OH
[zip] => 44720
[country] => United States
[phoneNumber] => 1234567890
[faxNumber] => 123-456-7890
)
[customerPaymentProfileId] => 33333333
[payment] => SimpleXMLElement Object
(
[creditCard] => SimpleXMLElement Object
(
[cardNumber] => XXXX0002
[expirationDate] => XXXX
)
)
)
)
[shipToList] => Array
(
[0] => SimpleXMLElement Object
(
[firstName] => Test
[lastName] => Test
[company] => Company Name
[address] => 1234 Test St
[city] => Testlyvania
[state] => OH
[zip] => 44720
[country] => United States
[phoneNumber] => 123-456-7890
[faxNumber] => SimpleXMLElement Object
(
)
[customerAddressId] => 44444444
)
[1] => SimpleXMLElement Object
(
[firstName] => Test
[lastName] => Test
[company] => SimpleXMLElement Object
(
)
[address] => 1234 Test St
[city] => Testlyvania
[state] => OH
[zip] => 44720
[country] => United States
[phoneNumber] => 1234567890
[faxNumber] => 123-456-7890
[customerAddressId] => 55555555
)
)
)
)
SimpleXMLElement Object
(
[merchantCustomerId] => 1
[description] => Customer Profile for Store Code MC Created 11/20/13
[email] => email@email.com
[customerProfileId] => 11111111
[paymentProfiles] => Array
(
[0] => SimpleXMLElement Object
(
[customerType] => individual
[billTo] => SimpleXMLElement Object
(
[firstName] => Test
[lastName] => Test
[company] => Company Name
[address] => 1234 Test St
[city] => Testlyvania
[state] => OH
[zip] => 44720
[country] => United States
[phoneNumber] => 123-456-7890
[faxNumber] => SimpleXMLElement Object
(
)
)
[customerPaymentProfileId] => 22222222
[payment] => SimpleXMLElement Object
(
[creditCard] => SimpleXMLElement Object
(
[cardNumber] => XXXX1111
[expirationDate] => XXXX
)
)
)
[1] => SimpleXMLElement Object
(
[customerType] => individual
[billTo] => SimpleXMLElement Object
(
[firstName] => Test
[lastName] => Test
[company] => SimpleXMLElement Object
(
)
[address] => 1234 Test St
[city] => Testlyvania
[state] => OH
[zip] => 44720
[country] => United States
[phoneNumber] => 1234567890
[faxNumber] => 123-456-7890
)
[customerPaymentProfileId] => 33333333
[payment] => SimpleXMLElement Object
(
[creditCard] => SimpleXMLElement Object
(
[cardNumber] => XXXX0002
[expirationDate] => XXXX
)
)
)
)
[shipToList] => Array
(
[0] => SimpleXMLElement Object
(
[firstName] => Test
[lastName] => Test
[company] => Company Name
[address] => 1234 Test St
[city] => Testlyvania
[state] => OH
[zip] => 44720
[country] => United States
[phoneNumber] => 123-456-7890
[faxNumber] => SimpleXMLElement Object
(
)
[customerAddressId] => 44444444
)
[1] => SimpleXMLElement Object
(
[firstName] => Test
[lastName] => Test
[company] => SimpleXMLElement Object
(
)
[address] => 1234 Test St
[city] => Testlyvania
[state] => OH
[zip] => 44720
[country] => United States
[phoneNumber] => 1234567890
[faxNumber] => 123-456-7890
[customerAddressId] => 55555555
)
)
)
SimpleXMLElement Object
(
[customerType] => individual
[billTo] => SimpleXMLElement Object
(
[firstName] => Test
[lastName] => Test
[company] => Company Name
[address] => 1234 Test St
[city] => Testlyvania
[state] => OH
[zip] => 44720
[country] => United States
[phoneNumber] => 123-456-7890
[faxNumber] => SimpleXMLElement Object
(
)
)
[customerPaymentProfileId] => 22222222
[payment] => SimpleXMLElement Object
(
[creditCard] => SimpleXMLElement Object
(
[cardNumber] => XXXX1111
[expirationDate] => XXXX
)
)
)
如您所见,一旦直接访问“paymentProfiles”属性,它就从Array类型变成Object类型。然而,如果我试图直接访问它的第二个索引,那就很好了
PHP代码:
print_r($parsedresponse);
print_r($parsedresponse->profile);
print_r($parsedresponse->profile->paymentProfiles);
print_r($parsedresponse->profile->paymentProfiles[1])
生成以下输出:
SimpleXMLElement Object
(
[customerType] => individual
[billTo] => SimpleXMLElement Object
(
[firstName] => Test
[lastName] => Test
[company] => SimpleXMLElement Object
(
)
[address] => 1234 Test St
[city] => Testlyvania
[state] => OH
[zip] => 44720
[country] => United States
[phoneNumber] => 1234567890
[faxNumber] => 123-456-7890
)
[customerPaymentProfileId] => 33333333
[payment] => SimpleXMLElement Object
(
[creditCard] => SimpleXMLElement Object
(
[cardNumber] => XXXX0002
[expirationDate] => XXXX
)
)
)
为什么直接访问时,$parsedresponse->profile->paymentProfiles的行为像一个对象,而不像预期的那样像一个数组?另一个答案似乎包含了您需要的大部分信息。它帮助了我。foreach循环对我来说很好,尽管循环的标准也很好 因此,即使根据print\r,$parsedresponse->profile不是数组,您也应该能够执行以下操作。如果$parsedresponse->profile是一个数组,它也应该可以工作
print_r($parsedresponse);
foreach($profile as $prof){
print_r($prof);
foreach($prof->paymentProfiles as $pProf){
print_r($pProf);
}
}
print\u r
和var\u dump
对于simplexmlement
几乎是无用的。几乎每个子节点和属性本身都将是一个simplexmlement
,即使它看起来像表面上的数组