在Xml的Array上使用Hash :: extract()

时间:2014-04-21 20:09:15

标签: cakephp cakephp-2.4 cakephp-2.4.7

我有一个数组如下:

array(
    'items' => array(
        'item' => array(
            (int) 0 => array(
                '@item' => '3-394-001068-00000'),
            (int) 1 => array(
                '@item' => '3-394-001069-00000'),
            )
     )
)

我正在尝试将所有'item'条目提取到一个新数组。

到目前为止,这是我的代码:

$xmlarray = Xml::toArray(Xml::build(WWW_ROOT .'files/itemsAll/'.$file));

            debug($xmlarray);
            $results = Hash::extract($xmlarray, '{n}.item');

            debug ($results);

但这只返回一个空数组。 有人可能会给我一个暗示我出错的地方吗?

提前致谢

2 个答案:

答案 0 :(得分:2)

你的问题并不清楚,但我假设这个数组

array(
    'items' => array(
        'item' => array(
            (int) 0 => array(
                '@item' => '3-394-001068-00000'),
            (int) 1 => array(
                '@item' => '3-394-001069-00000'),

是您debug($xmlarray);的结果,因此我们可以排除文件的错位(如果我假设错了,请告诉)。

所以,哈希是你的问题。

根据docs{n}指的是"数字键"和"项"显然不是。如果你想提取所有"项目"在" items",它应该是

Hash::extract($xmlarray, 'items.item');

那会给你

array((int) 0 => array(
                '@item' => '3-394-001068-00000'),
            (int) 1 => array(
                '@item' => '3-394-001069-00000'),
/*etc*/

并且,如果你想要一个非常紧凑的数组(不知道你是否需要索引关联),你可以尝试

Hash::extract($xmlarray, 'items.item.{n}.@item');

那会让你

array('3-394-001068-00000', '3-394-001069-00000')

答案 1 :(得分:0)

首先,有更好的方法从XML文件中提取信息,而不是转换为数组然后使用Hash::extract()。 Cake的XML library默认返回一个SimpleXML对象,因此read up on the docs on that用于直接从XML中提取信息。具体来说,xpath方法可能对您有用。您的使用可能如下所示:

<?php
$xmlobj = Xml::build(WWW_ROOT .'files/itemsAll/'.$file);
$items = $xmlobj->xpath('/items/item');
?>

然后你可以遍历$ items对象来做你需要的任何元素。

也就是说,如果您坚持使用Hash::extract(),查看转储数组,则item条目不在数字键下,因此{n}无法访问它们。您可能需要items.item,或者他们可以使用除了&#39;项目&#39;,{s}.item之外的其他键。