Итерирование zend_config_xml только с 1 дочерним узлом? - PullRequest
1 голос
/ 26 августа 2010

У меня есть базовый экземпляр 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, но не replenish_departments.

В чем тут подвох?

РЕДАКТИРОВАТЬ: Я обнаружил, что если я приведу $ inv_settings в качестве массива внутри foreach, я могу выполнить итерацию без ошибки. Пока что этот метод я использую, но я все еще открыт для лучшего исправления.

Ответы [ 3 ]

0 голосов
/ 28 августа 2010

Ваш пример 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;
    }
}

Что дает ожидаемый результат:

М нуждается в пополнении!

Я не уверен, как вы пришли к выводу о невозможности перебора одного элемента.

P.S. Вместо того чтобы приводить тип к массиву, вы можете использовать метод toArray() для получения конфигурации (или ее части) в виде массива.

0 голосов
/ 15 мая 2012

Только для тех других людей, которые здесь оказываются (как я).

Хотел бы поделиться, что теперь это можно сделать с помощью последней версии Zend Framework.Используется 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>
0 голосов
/ 27 августа 2010

Я только что написал это быстро, это будет работать в вашей ситуации или это не то, что вы после?

$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;
    }   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...