【问题标题】:Using Hash::extract() on Array from Xml对来自 Xml 的数组使用 Hash::extract()
【发布时间】:2014-04-21 20:09:14
【问题描述】:

我有一个数组如下:

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

我正在尝试将所有“项目”条目提取到一个新数组中。

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

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

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

            debug ($results);

但这只会返回一个空数组。 有人可以提示我哪里出错了吗?

提前致谢

【问题讨论】:

    标签: cakephp cakephp-2.4 cakephp-2.4.7


    【解决方案1】:

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

    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”中的所有“item”,应该是

    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')
    

    【讨论】:

    • 您好 Nunser,非常感谢您的快速答复。你的代码做了我想让我的代码做的事情:-)
    【解决方案2】:

    首先,有更好的方法从 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,或者如果它们可以位于“项目”以外的键下,{s}.item

    【讨论】:

    • 你好cincodenada,也感谢你的快速回答和帮助我。您的示例对我来说也很好,所以现在我必须检查哪种解决方案对数据量更快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多