Итерирование 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>