1

我有一个基本的 zend_config_xml 实例,它存储一些库存信息,例如哪些产品正在补货 (replenish_departments) 与哪些产品不能重新订购 (fashion_departments)。(仅供参考,我们的产品分为部门,每个部门都有一个唯一的字母代码)我的 xml 看起来类似于:

<inventory>
 <settings>
  <allow_backorders>1</allow_backorders>
  <replenish_departments>
   <department>M</department>
  </replenish_departments>
  <fashion_departments>
   <department>MF</department>
   <department>MS</department>
  </fashion_departments>
 </settings>
</inventory>

我需要做的是快速判断给定的部门代码是在补充还是流行。我正在尝试的很简单(或者我认为):

foreach ($inv_settings->replenish_departments as $replenish_deptcode) {
 if ($given_deptcode == $replenish_deptcode) return true;
}

然而,我发现当只有一个子节点时,你不能遍历它。换句话说,这个代号为fashion_departments,而不是replenished_departments。

这里有什么诀窍?

编辑:我发现如果我将 $inv_settings 类型转换为 foreach 内的一个数组,我可以在没有错误的情况下进行迭代。目前,这是我正在使用的方法,但我仍然愿意接受更好的修复。

4

3 回答 3

0

只是为了那些最终来到这里的人(比如我)。

想分享一下,现在可以使用最新版本的 zend 框架来完成。使用 1.11.11,但修复已经有一段时间了,请参阅http://framework.zend.com/issues/browse/ZF-2285

    $xml = '<?xml version="1.0"?>
    <inventory>
        <settings>
    <allow_backorders>1</allow_backorders>
   <replenish_departments>
      <department>M</department>
   </replenish_departments>
   <fashion_departments>
      <department>MF</department>
      <department>MS</department>
   </fashion_departments>
   </settings>
   </inventory>';

    $article = new Zend_Config_Xml($xml);
Zend_Debug::dump($article->toArray());

返回

array(1) {
  ["settings"] => array(3) {
    ["allow_backorders"] => string(1) "1"
      ["replenish_departments"] => array(1) {
         ["department"] => string(1) "M"
      }
      ["fashion_departments"] => array(1) {
        ["department"] => array(2) {
         [0] => string(2) "MF"
         [1] => string(2) "MS"
      }
    }
  }
}

它似乎不允许根多个元素。

   <inventory>
     value1
   </inventory>
   <inventory>
     value2
   </inventory>
于 2012-05-15T15:46:59.080 回答
0

您的示例 XML 配置文件和代码对我来说似乎工作正常。这是我使用的片段:

$given_deptcode = 'M';
$configuration  = new Zend_Config_Xml($config_file);
$inv_settings   = $configuration->settings;
foreach ($inv_settings->replenish_departments as $replenish_deptcode) {
    if ($replenish_deptcode == $given_deptcode) {
        echo $replenish_deptcode . ' needs replenishing!' . PHP_EOL;
    }
}

这给出了预期的输出:

M需要补货!

我不确定您是如何得出无法迭代一项的结论的。

PS而不是类型转换为数组,您可以使用该toArray()方法以数组形式获取配置(或其一部分)。

于 2010-08-27T20:31:35.730 回答
0

我只是很快写了这个,这将适用于你的情况,还是这不是你想要的?

$xml = simplexml_load_string("<inventory>
 <settings>
  <allow_backorders>1</allow_backorders>
  <replenish_departments>
   <department>M</department>
  </replenish_departments>
  <fashion_departments>
   <department>MF</department>
   <department>MS</department>
  </fashion_departments>
 </settings>
</inventory>
");

foreach ($xml->settings->replenish_departments as $replenish_departments) {
    foreach ($replenish_departments as $department)
    {
         if ($given_deptcode == $department) 
            return true;
    }   
}
于 2010-08-27T08:35:12.623 回答