2010-08-26 3 views
1

У меня есть основной экземпляр zend_config_xml, в котором хранится информация инвентаризации, например, какие продукты находятся на пополнении (replenish_departments), и какие продукты не могут быть переупорядочены (fashion_departments). (FYI наши продукты подразделяются на отделы, каждый отдел имеет уникальный альфа-код) Мой XML похож на:Итерация zend_config_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, но не для пополнения_депозитов.

Какая уловка здесь?

EDIT: Я обнаружил, что если я задаю $ inv_settings как массив внутри foreach, я могу выполнить итерацию без ошибки. На данный момент это метод, который я использую, но я все еще открыт для лучшего исправления.

+0

Если ваш запрос XML, будет ли XPath не делать это для вас лучше? –

+0

Возможно, но поскольку Zend_Config_Xml не имеет собственного метода xpath для доступа, он, вероятно, будет излишним здесь. – user280725

+0

Как вы определяете $ inv_settings как массив? У меня такая же проблема, и 'foreach ((array) $ inv_settings-> replenish_departments как $ replenish_deptcode)' не решает. – Seb33300

ответ

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; 
    } 
} 
+0

Да, это то, что я ищу, НО, Zend_Config_Xml не расширяет SimpleXml, поэтому он ведет себя по-другому.Если я использую тот же самый код, но отключу $ xml для экземпляра Zend_Config_Xml, я получаю следующую ошибку: «Предупреждение: неверный аргумент, предоставленный foreach()», если в разделе replenish_departments имеется только один дельта-узел. – user280725

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 needs replenishing!

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

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

+0

Ваш код принимает один узел отдела под x_departments. Измените свой код, чтобы посмотреть на mod_departments или добавить другой отдел в разделе replenish_department и разрывы кода. – user280725

0

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

Хотел разделить, что это может быть выполнено сейчас с использованием последней версии 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> 
Смежные вопросы