foreach, simplexml

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : foreach, simplexml

Re: foreach, simplexml

par xTG » 26 oct. 2012, 11:03

Relis ce que tu as codé et relis ce que j'ai codé et cherches l'intrus. ;)
C'est une simple faute d'inattention ou de non compréhension des bases de la programmation (ou de l'algèbre de Boole).

Re: foreach, simplexml

par damien_55 » 25 oct. 2012, 21:22

J'ai essayé comme ceci

foreach ($xml ->Organisme as $value) {
$xml2=$value->Ouverture;
$xml3=$xml->Organisme;

$out='';
foreach ($xml2 as $value1) {
	$out.=$Jour_ouverture_debut= $value1->PlageJ['début'].'-';
    $out.=$Jour_ouverture_fin= $value1->PlageJ['fin'].'<br>';
    echo $out; 
    
     
    $xml1=$xml2;
foreach ($xml1 ->PlageJ as $value2) {
	$heure_ouverture_debut= $value2->PlageH['début'];
    $heure_ouverture_fin= $value2->PlageH['fin'];
    echo '<br><br>'.$heure_ouverture_debut.'-'.$heure_ouverture_fin.'<br><br>'; 
    }
    
    
    
}
ça ne marche pas non plus :?

Re: foreach, simplexml

par xTG » 25 oct. 2012, 20:42

Tu utilises une variable que tu écrases à chaque itération de ta boucle.
Exemple du problème et une solution :
$array = array(1, 2, 3, 4);
$out = '';
foreach($array as $val)
  $out = $val;
echo $out; // 4

$out = '';
foreach($array as $val)
  $out .= $val . "_";
echo $out; // 1_2_3_4_

Re: foreach, simplexml

par damien_55 » 25 oct. 2012, 18:46

J'ai repris avec ce xml simple

Code : Tout sélectionner

<Organisme > <Ouverture> <PlageJ début="lundi" fin="jeudi"> <PlageH début="08:30:00" fin="16:00:00"/> </PlageJ> <PlageJ début="vendredi" fin="vendredi"> <PlageH début="08:30:00" fin="15:00:00"/> </PlageJ> </Ouverture> </Organisme> <Organisme > <Ouverture> <PlageJ début="lundi" fin="mardi"> <PlageH début="08:30:00" fin="13:00:00"/> </PlageJ> <PlageJ début="samedi" fin="dimanche"> <PlageH début="08:30:00" fin="11:00:00"/> </PlageJ> </Ouverture> </Organisme> </channel>
J'ai fait ce script php
$xml = simplexml_load_file('essai.xml');



foreach ($xml ->Organisme as $value) {
$xml2=$value->Ouverture;
$xml3=$xml->Organisme;

foreach ($xml3 ->Ouverture as $value1) {
	$Jour_ouverture_debut= $value1->PlageJ['début'];
    $Jour_ouverture_fin= $value1->PlageJ['fin'];
    echo '<br><br>'.$Jour_ouverture_debut.'-'.$Jour_ouverture_fin.'<br>'; 
    
    $xml1=$xml2;
foreach ($xml1 ->PlageJ as $value2) {
	$heure_ouverture_debut= $value2->PlageH['début'];
    $heure_ouverture_fin= $value2->PlageH['fin'];
    echo '<br><br>'.$heure_ouverture_debut.'-'.$heure_ouverture_fin.'<br><br>'; 
    }
    }
}
Et cela me donne comme resultat

lundi-jeudi
08:30:00-16:00:00
08:30:00-15:00:00


lundi-jeudi
08:30:00-13:00:00
08:30:00-11:00:00

Sur les heures apparement je suis ok mais sur les jours <PlageJ > je ne récupère que les premiers attributs, je ne comprends absolument pas pourquoi la boucle ne s'éffectue pas ???

Re: foreach, simplexml

par damien_55 » 25 oct. 2012, 17:58

J'ai réessayé comme ceci

Code : Tout sélectionner

foreach ($xml ->Organisme as $value) { $xml2=$value->Ouverture; print_r($xml2); foreach ($value ->Ouverture as $value1) { $Jour_ouverture_debut= $value1->PlageJ['début']; $Jour_ouverture_fin= $value1->PlageJ['fin']; echo '<br><br>'.$Jour_ouverture_debut.'-'.$Jour_ouverture_fin.'<br><br>'; } }
mais ça ne donne toujours que la premiere valeur ??? je ne comprends pas pourquoi??

Re: foreach, simplexml

par damien_55 » 25 oct. 2012, 15:40

J'ai essayé avec autre chose DOM xpath
$str_nodes="//Organisme/Nom";
$result = $xpath->query($str_nodes);
foreach ($result as $div) {
echo $contenu = $div->nodeValue.'<br>';;
}

$str_nodes1="//Organisme/Ouverture/PlageJ/@début";
$str_nodes2="//Organisme/Ouverture/PlageJ/@fin";
$result1 = $xpath->query($str_nodes1);
$result2 = $xpath->query($str_nodes2);
foreach ($result1 as $div1) {
echo $contenu1 = $div1->nodeValue.'<br>';
}
foreach ($result2 as $div2) {
echo $contenu2 = $div2->nodeValue.'<br>';
}
Je récupère bien les valeurs mais pas dans le bon ordre

J'ai

lundi
vendredi
jeudi
vendredi

Donc tout les

Code : Tout sélectionner

<PlageJ début=.....> en premier
lundi et vendredi et tout les <PlageJ fin=....> Jeudi et vendredi

Je voudrais obtenir un résutat comme ceci lundi-Jeudi et vendredi-Vendredi ce qui coorespond exactement à ça

Code : Tout sélectionner

<PlageJ début="lundi" fin="jeudi"> <PlageH début="08:30:00" fin="16:00:00"/> </PlageJ> <PlageJ début="vendredi" fin="vendredi"> <PlageH début="08:30:00" fin="15:00:00"/>

Merci de votre aide

Re: foreach, simplexml

par damien_55 » 25 oct. 2012, 13:58

J'ai essayé ça
$ouverture= $value->Ouverture;
    
   print_r($ouverture);
   
     foreach ($ouverture as $valeur) {
    $jour_ouverture_debut= $valeur->PlageJ['début'];
    $jour_ouverture_fin= $valeur->PlageJ['fin'];
    $heure_ouverture_debut= $valeur->PlageJ->PlageH['début'];
    $heure_ouverture_fin= $valeur->PlageJ->PlageH['fin'];
    echo $jour_ouverture_debut.'-'.$jour_ouverture_fin.'<br><br>'; 
    echo $heure_ouverture_debut.'-'.$heure_ouverture_fin.'<br><br>';
    }
le print-r me donne bien

Code : Tout sélectionner

SimpleXMLElement Object ( [PlageJ] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [début] => lundi [fin] => jeudi ) [PlageH] => SimpleXMLElement Object ( [@attributes] => Array ( [début] => 08:30:00 [fin] => 16:00:00 ) ) ) [1] => SimpleXMLElement Object ( [@attributes] => Array ( [début] => vendredi [fin] => vendredi ) [PlageH] => SimpleXMLElement Object ( [@attributes] => Array ( [début] => 08:30:00 [fin] => 15:00:00 ) ) ) ) )
Le problème, c'est mes echos me renvoie que

lundi-jeudi

08:30:00-16:00:00

Donc la première entrée du tableau et pas la suivante ???

foreach, simplexml

par damien_55 » 25 oct. 2012, 12:38

Bonjour,

J'ai un petit soucis sur une boucle foreach avec un simplexml

voici mon fichier xml

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8"?><channel> <Organisme> <Nom>bbbbbbbbbbb</Nom> <Ouverture> <PlageJ début="lundi" fin="jeudi"> <PlageH début="08:30:00" fin="16:00:00"/> </PlageJ> <PlageJ début="vendredi" fin="vendredi"> <PlageH début="08:30:00" fin="15:00:00"/> </PlageJ> </Ouverture> </Organisme> <Organisme> <Nom>rrrrrrrrrr</Nom> <Ouverture> <PlageJ début="lundi" fin="vendredi"> <PlageH début="08:30:00" fin="16:00:00"/> </PlageJ> <PlageJ début="samedi" fin="samedi"> <PlageH début="08:30:00" fin="12:00:00"/> </PlageJ> </Ouverture> </Organisme> </channel>
J'arrive bien à récupérer les infos via simplexml
<?php

$xml = simplexml_load_file('test.xml');

foreach ($xml ->Organisme as $value) {
$Nom = $value->Nom;
$jour_ouverture_debut= $valeur->PlageJ['début'];
$jour_ouverture_fin= $valeur->PlageJ['fin'];
$heure_ouverture_debut= $value->Ouverture->PlageJ->PlageH['début'];
$heure_ouverture_fin= $value->Ouverture->PlageJ->PlageH['fin'];

echo $Nom.'<br>';
echo $jour_ouverture_debut.'-'.$jour_ouverture_fin.'<br><br>';    
echo $heure_ouverture_debut.'-'.$heure_ouverture_fin.'<br><br>';

}
?>
Sauf sur cette partie

Code : Tout sélectionner

<Ouverture> <PlageJ début="lundi" fin="jeudi"> <PlageH début="08:30:00" fin="16:00:00"/> </PlageJ> <PlageJ début="vendredi" fin="vendredi"> <PlageH début="08:30:00" fin="15:00:00"/> </PlageJ> </Ouverture>
que je n'arrive pas à mettre en boucle, j'ai essayé ceci
foreach ($xml ->Organisme as $value) {
	$Nom = $value->Nom;
foreach ($value ->Ouverture as $valeur) {
    $jour_ouverture_debut= $valeur->PlageJ['début'];
    $jour_ouverture_fin= $valeur->PlageJ['fin'];
    }
 }
mais rien ne s'affiche -( Merci de votre aide