vaclavvanik/dom-to-array

将 DOM Document 转换为 PHP 数组的一种简单方法

1.0.0 2023-10-31 10:06 UTC

This package is auto-updated.

Last update: 2024-09-30 01:16:33 UTC


README

此软件包提供了一种将 DOMDocument 转换为 PHP 数组的简单方法。

DomToArray 支持属性、cdata 和类似数组的元素。

主要用途是将任何 XML API 响应转换为数组。DomToArray 使用了古老的 PHP DOMDocument 对象。XML API 响应是字符串,可以完美地加载到 DOMDocument 中,使用 vaclavvanik/dom-loader

安装

您可以通过 composer 安装此软件包。

composer require vaclavvanik/dom-to-array

使用方法

简单传递 DOMDocument

<?php

declare(strict_types=1);

use DOMDocument;
use VaclavVanik\DomToArray;

$doc = new DOMDocument();
$doc->loadXML('<root/>');

$result = DomToArray::toArray($doc);
// $result = ['root' => ''];

数组元素

具有相同名称的多个元素将创建多维数组。

<root>
    <name>guy collection</name>
    <good_guy>
        <name>Luke Skywalker</name>
        <weapon>Lightsaber</weapon>
    </good_guy>
    <good_guy>
        <name>Gandalf</name>
        <weapon>Staff</weapon>
    </good_guy>
    <bad_guy>
        <name>Saruman</name>
        <weapon>Staff</weapon>
    </bad_guy>
    <bad_guy>
        <name>Sauron</name>
        <weapon>Ring</weapon>
    </bad_guy>
</root>

这将产生以下结果

$result = [
    'root' => [
        'name' => 'guy collection',
        'good_guy' => [
            [
                'name' => 'Luke Skywalker',
                'weapon' => 'Lightsaber',
            ],
            [
                'name' => 'Gandalf',
                'weapon' => 'Staff',
            ],
        ],
        'bad_guy' => [
            [
                'name' => 'Saruman',
                'weapon' => 'Staff',
            ],
            [
                'name' => 'Sauron',
                'weapon' => 'Ring',
            ],
        ],
    ],
];

属性

元素属性创建键 => 值,例如 element_name@attribute_name => attribute_value

<root attr="val">
    <single type="any"/>
    <collection type="any1"/>
    <collection type="any2"/>
    <author lang="English">Tolkien</author>
    <guy lang="Black Speech">
        <name weapon="Ring">Sauron</name>
        <weapon>Ring</weapon>
    </guy>
    <guy lang="Elvish">
        <name weapon="Staff">Gandalf</name>
        <weapon>Staff</weapon>
    </guy>
    <bad_guy lang="Unknown">
        <name weapon="Staff">Saruman</name>
        <name weapon="Ring">Sauron</name>
    </bad_guy>
</root>

这将产生以下结果

$result = [
    'root' => [
        'single' => '',
        'single@type' => 'any',
        'collection' => [
            ['collection@type' => 'any1'],
            ['collection@type' => 'any2'],
        ],
        'author' => 'Tolkien',
        'author@lang' => 'English',
        'guy' => [
            [
                'name' => 'Sauron',
                'name@weapon' => 'Ring',
                'weapon' => 'Ring',
                'guy@lang' => 'Black Speech',
            ],
                'name' => 'Gandalf',
                'name@weapon' => 'Staff',
                'weapon' => 'Staff',
                'guy@lang' => 'Elvish',
            ],
        ],
        'bad_guy' => [
            [
                'name' => 'Saruman',
                 'name@weapon' => 'Staff',
            ],
            [
                'name' => 'Sauron',
                'name@weapon' => 'Ring',
            ],
        ],
        'bad_guy@lang' => 'Unknown',
    ],
    'root@attr' => 'val',
];

Cdata

Cdata 转换与元素文本内容相同。

<root>
    <good_guy>
        <name><![CDATA[<h1>Gandalf</h1>]]></name>
        <weapon>Staff</weapon>
    </good_guy>
</root>

这将产生以下结果

$result = [
    'root' => [
        'good_guy' => [
            'name' => '<h1>Gandalf</h1>',
            'weapon' => 'Staff',
        ],
    ],
];

DomOptions

有时只处理元素(不需要属性)是有用的。

<?php

declare(strict_types=1);

use DOMDocument;
use VaclavVanik\DomToArray;

$domOptions = DomOptions::fromArray([DomOptions::SKIP_ATTRIBUTES => true]);
$result = DomToArray::toArrayWithOptions($doc, $domOptions);
<root attr="val">
    <single type="any"/>
    <collection type="any1"/>
    <collection type="any2"/>
    <author lang="English">Tolkien</author>
    <guy lang="Black Speech">
        <name weapon="Ring">Sauron</name>
        <weapon>Ring</weapon>
    </guy>
    <guy lang="Elvish">
        <name weapon="Staff">Gandalf</name>
        <weapon>Staff</weapon>
    </guy>
    <bad_guy lang="Unknown">
        <name weapon="Staff">Saruman</name>
        <name weapon="Ring">Sauron</name>
    </bad_guy>
</root>

这将产生以下结果

$result = [
    'root' => [
        'single' => '',
        'collection' => ['', ''],
        'author' => 'Tolkien',
        'guy' => [
            [
                'name' => 'Sauron',
                'weapon' => 'Ring',
            ],
            [
                'name' => 'Gandalf',
                'weapon' => 'Staff',
            ],
        ],
        'bad_guy' => [
            'name' => ['Saruman', 'Sauron'],
        ],
    ],
];

运行检查 - 编码规范和 php-unit

安装依赖项

make install

运行检查

make check

变更日志

请参阅 CHANGELOG 了解最近更改的详细信息。

许可证

MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件