Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend:如何使用Zend_Config_XML管理多个元素具有相同名称的XML数据?_Php_Xml_Zend Framework_Zend Config Xml - Fatal编程技术网

Php Zend:如何使用Zend_Config_XML管理多个元素具有相同名称的XML数据?

Php Zend:如何使用Zend_Config_XML管理多个元素具有相同名称的XML数据?,php,xml,zend-framework,zend-config-xml,Php,Xml,Zend Framework,Zend Config Xml,在尝试使用Zend_Config_XML从XML文件提取数据时,我正在寻找处理多个元素具有相同名称的数据的最佳方法。请看下面的例子 以下是XML文件: <?xml version="1.0" encoding="UTF-8" ?> <root> <stylesheets> <stylesheet>example1.css</stylesheet> <stylesheet>example

在尝试使用
Zend_Config_XML
从XML文件提取数据时,我正在寻找处理多个元素具有相同名称的数据的最佳方法。请看下面的例子

以下是XML文件:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <stylesheets>
        <stylesheet>example1.css</stylesheet>
        <stylesheet>example2.css</stylesheet>
    </stylesheets>
</root>
我想做的是使用foreach循环迭代
$stylesheet
数组,提取文件名,然后将样式表附加到
headLink()
。这个很好用。。。但是,当
元素的数量小于2时,我会遇到问题。例如,如果我们从XML文件中删除
example2.css
,我会遇到一个
致命错误:对非对象调用成员函数toArray()。你会如何处理这种情况

更新1-替代SimpleXML解决方案:

就我个人而言,我使用SimpleXML解决了这个问题,因为Zend给我带来了太多的白发。即使没有
元素,这也会起作用。不幸的是,我觉得它不是很“圆滑”,我希望有一个Zend解决方案

// define path to skin XML config file
$path = './path/to/file';

if (file_exists($path)) {
    // load the config file via SimpleXML
    $xml = simplexml_load_file($path);
    $stylesheets = (array)$xml->stylesheets;

    // append each stylesheet
    foreach ($stylesheets as $stylesheet) {
        if (is_array($stylesheet)) {
            foreach ($stylesheet as $key => $value) {
                $this->setStylesheet('/path/to/css/' . $value);
            }
        } else {
            $this->setStylesheet('/path/to/css/' . $stylesheet);
        }
    }
}

// function to append stylesheets
private function setStylesheet($path)
{
    $this->view->headLink()->appendStylesheet($path);
}
更新2-笨重的Zend解决方案:

根据反馈,此解决方案可用于0到多个
样式表
元素。。。它不是很漂亮。我希望能有一个松散耦合的设计,一个标准化的设计,可以互换使用,同时也可以简单地实现

// load the skin config file
$path = './path/to/file.xml';
if (file_exists($path)) {
    $data = new Zend_Config_Xml($path, 'stylesheets');
    $stylesheets = $data->toArray();

    // append each stylesheet
    if (array_key_exists('stylesheet', $stylesheets)) {
        foreach ((array)$stylesheets['stylesheet'] as $key => $value) {
            $this->view->headLink()->appendStylesheet(
                '/path/to/css/' . $value);
        }
    }
}

如果只有1个元素,则获取数组并强制执行数组:

$data = new Zend_Config_Xml($c, 'stylesheets');
$data = $data->toArray();
var_dump((array) $data['stylesheet']);

这里有一个类似的问题:被接受的答案可以引导您找到一些可能的解决方法。感谢您将问题链接起来。对于这个特殊的问题,我有自己的解决方法,但是我认为它不是很。。。漂亮的我不是在寻找一个快速的解决方案,我试图通过查看各种响应,权衡每种方法,并通过提供一个可靠的解决方案为社区添加内容来建立最佳实践。感谢反馈,请参见上文。
$data = new Zend_Config_Xml($c, 'stylesheets');
$data = $data->toArray();
var_dump((array) $data['stylesheet']);