SimpleXML 到数组
SimpleXML to Array
我加载了一些 XML 生成一个简单的XML 对象(只显示一个对象)
SimpleXMLElement Object
(
[Jobs] => SimpleXMLElement Object
(
[Job] => Array
(
[0] => SimpleXMLElement Object
(
[ID] => J000001
[Name] => Internal Time
[Description] => Use this job to record your internal and non-billable time for activities such as annual leave, sick leave, professional development, staff meetings etc
[Client] => SimpleXMLElement Object
(
[ID] => 8430219
[Name] => Fake Client
)
[ClientOrderNumber] => SimpleXMLElement Object
(
)
[State] => Planned
[StartDate] => 2016-03-21T00:00:00
[DueDate] => 2017-03-21T00:00:00
[InternalID] => 11442733
[Assigned] => SimpleXMLElement Object
(
[Staff] => SimpleXMLElement Object
(
[ID] => 344460
[Name] => Som Name
)
)
)
)
)
)
我想做的是创建一个客户端名称和客户端 ID 的数组。所以我的目标是这样
[data] => array (
8430219 => Fake Client,
8430343 => Another Client,
etc
)
目前,我可以得到名称,但在 id 上苦苦挣扎,因为它说它是非法的偏移类型。这就是我的
foreach($oXML->Jobs as $oEntry) {
foreach ($oEntry->Job as $data) {
$jobsArray = array(
$data->Client->ID => $data->Client->Name
);
}
}
如何基于我拥有的简单XML对象创建数组?
谢谢
首先,要获得你想要的数组,你不能使用这个语法:
$jobsArray = array( $key => $val );
你必须使用这样的东西:
$jobsArray[$key] = $val;
否则,在每个重复循环中,您的语法将覆盖先前的数组值。
那么,我建议你使用XPath来简化整个过程。使用 XPath 查询,您只需一次搜索即可检索一组节点。
假设你有这个 XML:
<?xml version="1.0"?>
<Jobs>
<Job>
<Client>
<ID>8430219</ID>
<Name>Fake Client</Name>
</Client>
<Client>
<ID>8430220</ID>
<Name>Fake Client 2</Name>
</Client>
</Job>
<Job>
<Client>
<ID>8430221</ID>
<Name>Fake Client 3</Name>
</Client>
</Job>
</Jobs>
使用此 xpath 查询:
$clients = $oXML->xpath( '/Jobs/Job/Client' );
您在 $clients
中获得所有 <Client>
节点。然后你可以这样创建你的数组:
$result = array();
foreach( $clients as $client )
{
$result[$client->ID->__toString()] = $client->Name->__toString();
}
这是 $result
在 foreach
循环之后:
Array
(
[8430219] => Fake Client
[8430220] => Fake Client 2
[8430221] => Fake Client 3
)
请注意,我们必须转换为字符串单节点(即 SimpleXML 对象):这绝对有必要创建键,否则数组分配将失败。您可以使用 (string) $client->ID
而不是 $client->ID->__toString()
获得相同的结果
- 阅读更多关于 SimpleXMLElement::xpath
- 阅读更多关于 XPath
我加载了一些 XML 生成一个简单的XML 对象(只显示一个对象)
SimpleXMLElement Object
(
[Jobs] => SimpleXMLElement Object
(
[Job] => Array
(
[0] => SimpleXMLElement Object
(
[ID] => J000001
[Name] => Internal Time
[Description] => Use this job to record your internal and non-billable time for activities such as annual leave, sick leave, professional development, staff meetings etc
[Client] => SimpleXMLElement Object
(
[ID] => 8430219
[Name] => Fake Client
)
[ClientOrderNumber] => SimpleXMLElement Object
(
)
[State] => Planned
[StartDate] => 2016-03-21T00:00:00
[DueDate] => 2017-03-21T00:00:00
[InternalID] => 11442733
[Assigned] => SimpleXMLElement Object
(
[Staff] => SimpleXMLElement Object
(
[ID] => 344460
[Name] => Som Name
)
)
)
)
)
)
我想做的是创建一个客户端名称和客户端 ID 的数组。所以我的目标是这样
[data] => array (
8430219 => Fake Client,
8430343 => Another Client,
etc
)
目前,我可以得到名称,但在 id 上苦苦挣扎,因为它说它是非法的偏移类型。这就是我的
foreach($oXML->Jobs as $oEntry) {
foreach ($oEntry->Job as $data) {
$jobsArray = array(
$data->Client->ID => $data->Client->Name
);
}
}
如何基于我拥有的简单XML对象创建数组?
谢谢
首先,要获得你想要的数组,你不能使用这个语法:
$jobsArray = array( $key => $val );
你必须使用这样的东西:
$jobsArray[$key] = $val;
否则,在每个重复循环中,您的语法将覆盖先前的数组值。
那么,我建议你使用XPath来简化整个过程。使用 XPath 查询,您只需一次搜索即可检索一组节点。
假设你有这个 XML:
<?xml version="1.0"?>
<Jobs>
<Job>
<Client>
<ID>8430219</ID>
<Name>Fake Client</Name>
</Client>
<Client>
<ID>8430220</ID>
<Name>Fake Client 2</Name>
</Client>
</Job>
<Job>
<Client>
<ID>8430221</ID>
<Name>Fake Client 3</Name>
</Client>
</Job>
</Jobs>
使用此 xpath 查询:
$clients = $oXML->xpath( '/Jobs/Job/Client' );
您在 $clients
中获得所有 <Client>
节点。然后你可以这样创建你的数组:
$result = array();
foreach( $clients as $client )
{
$result[$client->ID->__toString()] = $client->Name->__toString();
}
这是 $result
在 foreach
循环之后:
Array
(
[8430219] => Fake Client
[8430220] => Fake Client 2
[8430221] => Fake Client 3
)
请注意,我们必须转换为字符串单节点(即 SimpleXML 对象):这绝对有必要创建键,否则数组分配将失败。您可以使用 (string) $client->ID
而不是 $client->ID->__toString()
- 阅读更多关于 SimpleXMLElement::xpath
- 阅读更多关于 XPath