Итерирование zend_config_xml только с 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, но не replenish_departments.

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

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

3 ответа

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

$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;
    }   
}

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

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

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

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

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

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

Хотел бы поделиться, что это можно сделать сейчас с помощью последней версии 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>
Другие вопросы по тегам