2010-08-26 6 views
1

J'ai une instance de base de zend_config_xml qui stocke des informations d'inventaire telles que les produits en cours de réapprovisionnement (replenish_departments) par rapport aux produits qui ne peuvent pas être réorganisés (fashion_departments). (FYI nos produits sont classés dans les départements, chaque département a un code alpha unique) Mon xml ressemble à:Itérer zend_config_xml avec seulement 1 nœud enfant?

<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> 

Ce que je dois être en mesure de faire est de dire rapidement si un code de service donné est Replenish ou la mode. Ce que je voulais était simple (ce que je pensais):

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

Cependant, ce que j'ai découvert que quand il y a un seul nœud enfant, vous ne pouvez pas itérer à travers elle. En d'autres termes, ce mot de code pour fashion_departments, mais pas replenish_departments.

Quel est le truc ici?

EDIT: J'ai découvert que si je typifiais $ inv_settings en tant que tableau à l'intérieur du foreach, je suis capable d'itérer sans erreur. Pour l'instant, c'est la méthode que j'utilise, mais je suis toujours ouvert à une meilleure solution.

+0

Si vous interrogez XML, XPath ne le ferait-il pas mieux pour vous? –

+0

Peut-être, mais puisque Zend_Config_Xml n'a pas de méthode xpath natif pour accéder, il serait probablement exagéré ici. – user280725

+0

Comment typiez-vous $ inv_settings en tableau? J'ai le même problème, et 'foreach ((array) $ inv_settings-> replenish_departments que $ replenish_deptcode)' ne le résout pas. – Seb33300

Répondre

0

Je viens d'écrire ceci rapidement, cela fonctionnera dans votre situation ou n'est-ce pas ce que votre après?

$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

Oui, c'est ce que je cherche, MAIS, Zend_Config_Xml ne s'étend pas à SimpleXml donc il se comporte un peu différemment.Si j'utilise ce même code, mais que je change $ xml pour une instance de Zend_Config_Xml, l'erreur suivante s'affiche: "Avertissement: Argument invalide fourni pour foreach()" lorsqu'il n'y a qu'un seul noeud deptation sous replenish_departments. – user280725

0

Votre exemple de fichier de configuration XML et le code semblent fonctionner correctement pour moi. Voici l'extrait que je:

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

Ce qui donne le résultat attendu:

M needs replenishing!

Je ne sais pas comment vous êtes arrivé à la fin de ne pas pouvoir itérer sur un élément.

P.S. Plutôt que de taper dans un tableau, vous pouvez utiliser la méthode toArray() pour obtenir la configuration (ou une partie de celle-ci) sous forme de tableau.

+0

Votre code suppose un seul nœud de département sous x_departments. Changez votre code pour regarder fashion_departments ou ajoutez un autre département sous replenish_department et les sauts de code. – user280725

0

Juste pour les autres personnes qui se retrouvent ici (comme moi). Je voulais partager cela peut être accompli maintenant avec la dernière version de zend framework. Utilisé 1.11.11, mais aucune correction n'a été voir pendant quelque temps 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()); 

retours

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" 
     } 
    } 
    } 
} 

Il ne semble pas permettre à de multiples éléments racine.

<inventory> 
    value1 
    </inventory> 
    <inventory> 
    value2 
    </inventory> 
Questions connexes