Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML
XML Forum d'entraide sur XML avec PHP. Exemples : SimpleXML, OpenXML... Avant de poster -> FAQ XML, Cours XML et Sources XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/10/2007, 10h51   #1
Invité régulier
 
Inscription : août 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 9
Points : 6
Points : 6
Par défaut Pb avec comparaison de dates dans un XML

Bonjour tout le monde,

Je me permet de poster ici, car j'ai un léger souci.
En effet, dans mon code, je dois afficher toutes les dates écoulées entre 2 dates ( Date de début de projet et date du jour ).
Ca, j'ai pu trouver un bout de code que j'ai agrémenté à ma sauce pour le faire.
Cependant, la contrainte que je n'arrive pas à mettre en place dans mon code, c'est de n'afficher que les dates correspondant à des jours de la semaine. En gros, je dois exclure les Samedis et Dimanches de l'affichage.

Le code récupéré et modifié ressemble à ça:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
$xml = simplexml_load_file('xXxXxXx.xml');
 
 
function ObtenirDates ($Debut, $Fin) {
    $Start = strtotime ($Debut);
    $End = strtotime ($Fin);
 
    if (false === $Start || false === $End) {
        return false;
    }
    $aStart = explode ('-', $Debut);
    $aEnd = explode ('-', $Fin);
    if (count ($aStart) !== 3 || count ($aEnd) !== 3) {
        return false;
    }
    if (false === checkdate ($aStart[1], $aStart[2], $aStart[0]) || false === checkdate ($aEnd[1], $aEnd[2], $aEnd[0]) || $End <= $Start) {
        return false;
    }
    for ($i = $Start+86400; $i <$End; $i += 86400 ) {
        $Dates[] = strftime ('%d/%m/%Y', $i);
 
    }
    if (isset ($Dates) && !empty ($Dates) ) {
        return $Dates;
    } else {
        return false;
    }
}
 
foreach ($xml->task as $tache)
 
	{
		// variable $date du style : JJ/MM/AAAA
 
		$date = explode("/",$tache->start);
 
	// extraction des jour, mois, an de la date
			list($d, $m, $y) = explode('/', $tache->start);
			$timestamp = mktime ($d, $m, $y);
			$array= array ( $y, $m, $d);
			$deb = implode ('-', $array );
			$fin = date ("Y-m-d");
			$Dates = ObtenirDates ($deb, $fin);
			echo '<pre>', print_r ($Dates), '</pre>';
 
	}
 
?>
Quelqu'un aurait il une idée SVP?
Merci d'avance de bien vouloir aider un débutant du développement...
gaggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2007, 15h18   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Ça me paraît bien compliqué comme code et vos paramètres au niveau de mktime sont erronés.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
function date2timestamp($date) {
    if (preg_match('~^(\d{2})([-/])(\d{2})\2(\d{4})$~', $date, $m) && checkdate($m[3], $m[1], $m[4])) {
        return mktime(0, 0, 0, $m[3], $m[1], $m[4]);
    } else if (preg_match('~^(\d{4})([-/])(\d{2})\2(\d{2})$~', $date, $m) && checkdate($m[3], $m[4], $m[1])) {
        return mktime(0, 0, 0, $m[3], $m[4], $m[1]);
    } else {
        die("Problème sur une date : $date");
    }
}
 
function tri_par_date($elt) {
    global $tDeb, $tFin; // C'est laid mais ça simplifie
 
    $t = date2timestamp($elt->start);
    return $t >= $tDeb && $t <= $tFin && date('N', $t) < 6; /* Requiert PHP 5.1.0 ou + */
}
 
$tDeb = date2timestamp('11/10/2007');
$tFin = date2timestamp('16/10/2007');
 
$sxml = simplexml_load_file('tasks.xml');
$tasks = array_filter($sxml->xpath('//task'), 'tri_par_date');
foreach ($tasks as $t) {
    printf('%s : %s <br />', $t->start, $t->desc);
}
Mon fichier XML de test :
Code XML :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0" encoding="ISO-8859-1"?>
 
<racine>
    <task>
        <start>10/10/2007</start>
        <desc>mercredi</desc>
    </task>
    <task>
        <start>11/10/2007</start>
        <desc>jeudi</desc>
    </task>
    <task>
        <start>12/10/2007</start>
        <desc>vendredi</desc>
    </task>
    <task>
        <start>13/10/2007</start>
        <desc>samedi</desc>
    </task>
    <task>
        <start>14/10/2007</start>
        <desc>dimanche</desc>
    </task>
    <task>
        <start>15/10/2007</start>
        <desc>lundi</desc>
    </task>
    <task>
        <start>16/10/2007</start>
        <desc>mardi</desc>
    </task>
    <task>
        <start>10/10/2007</start>
        <desc>mercredi</desc>
    </task>
</racine>
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2007, 11h42   #3
Invité régulier
 
Inscription : août 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 9
Points : 6
Points : 6
Merci pour l'indication.
Toutefois, j'avais écris mon code par rapport à la structure de mon fichier XML ( qui m'est fourni et que je ne peux pas modifier ).

XML:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 
<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type='text/xsl' href='forme.xsl'?>
<tasks resource-id="CS">
<task id="200701" load="100">
<start>10/09/2007</start>
<project>xxxx</project>
<asker>xxx</asker>
<name>Tests</name>
<cat>WEBphp</cat>
<duedate>19/10/2007</duedate>
<end/><duration>10</duration>
<complete/>
<day id="10" month="09" year="2007">
<matin>1</matin><apresmidi>1</apresmidi>
</day>
<day id="11" month="09" year="2007">
<matin>1</matin><apresmidi>1</apresmidi>
</day>
<day id="12" month="09" year="2007">
<matin>1</matin><apresmidi>1</apresmidi>
</day>
<day id="17" month="09" year="2007">
<matin>1</matin>
</day>
<day id="25" month="09" year="2007">
<matin>1</matin>
</day>
<day id="26" month="09" year="2007">
<matin>1</matin><apresmidi>1</apresmidi>
</day>
<day id="27" month="09" year="2007">
<apresmidi>1</apresmidi><fini>1</fini>
</day>
<day id="28" month="09" year="2007">
<apresmidi>1</apresmidi>
</day>
</task><task id="200702" load="100">
<start>15/09/2007</start>
<project>xxxx</project>
<asker>xxx</asker>
<name>Tests Bis</name>
<cat>WEBphp</cat>
<duedate>19/10/2007</duedate>
<end/><duration>15</duration>
<complete/>
<day id="17" month="09" year="2007">
<apresmidi>1</apresmidi>
</day>
<day id="20" month="09" year="2007">
<matin>1</matin><apresmidi>1</apresmidi>
</day>
<day id="25" month="09" year="2007">
<apresmidi>1</apresmidi>
</day>
<day id="27" month="09" year="2007">
<matin>1</matin>
</day>
<day id="5" month="10" year="2007">
<matin>1</matin><apresmidi>1</apresmidi>
</day>
</task>
</tasks>
Lorsque j'essaie d'appliquer votre code à ce xml, cela ne fonctionne pas.
Alors peut être m'y suis je mal pris.
Le code que j'avais posté au départ me permet d'afficher toutes les dates comprises entre la date de la balise <start> et la date du jour.
Je vais essayer de modifier mes mktime dans mon code d'origine, mais je me permets de continuer à vous demander un coup de main...

Merci d'avance.

PS: j'avais oublié de préciser que je suis débutant en PHP... Mais vous avez du vous en douter^^
gaggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2007, 13h58   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Je n'avais pas compris le lien avec votre fichier XML. Vous demandiez plutôt, si j'ai bien compris cette fois :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
function date2timestamp($date) {
    if (preg_match('~^(\d{2})([-/])(\d{2})\2(\d{4})$~', $date, $m) && checkdate($m[3], $m[1], $m[4])) {
        return mktime(0, 0, 0, $m[3], $m[1], $m[4]);
    } else if (preg_match('~^(\d{4})([-/])(\d{2})\2(\d{2})$~', $date, $m) && checkdate($m[3], $m[4], $m[1])) {
        return mktime(0, 0, 0, $m[3], $m[4], $m[1]);
    } else {
        die("Problème sur une date : $date");
    }
}
 
function lister_dates($deb, $fin) {
    $tDeb = date2timestamp($deb);
    $tFin = date2timestamp($fin);
 
    $res = array();
    while ($tDeb < $tFin) {
        $tDeb += 86400;
        if (date('N', $tDeb) < 6) { /* Requiert PHP 5.1.0 ou + */
            array_push($res, date('d/m/Y', $tDeb));
        }
    }
    return $res;
}
 
header('Content-type: text/plain');
$sxml = simplexml_load_file('tasks.xml');
foreach ($sxml->task as $t) {
    print_r(lister_dates($t->start, date('d/m/Y'))); /* On peut éventuellement optimiser sur le deuxième paramètre puisqu'il correspond à la date actuelle ... */
}
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2007, 15h25   #5
Invité régulier
 
Inscription : août 2007
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 9
Points : 6
Points : 6
C'est exactement ça!!!!!

Je vous remercie sincèrement, ça faisait trois jours que je bloquais sur ce truc...

gaggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h26.


 
 
 
 
Partenaires

Hébergement Web