IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Fonctionnement de la fonction array_replace()


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Fonctionnement de la fonction array_replace()
    Bonjour,

    Je rencontre un problème avec une fonction array_replace qui jusque-là fonctionnait correctement. Et je ne vois pas mon erreur...

    Dans la gestion d'un calendrier, je forme une variable $BASE = array();. Je la remplis pour les 6 prochains mois avec des données "blanches" (toutes les mêmes).

    Puis je crée une nouvelle variable $OCCUP = array(); que j'alimente avec une base de données mysql.

    Ensuite je mets à jour $BASE avec les données de $OCCUP pour former $CALENDRIERVoici les résultats visualisés avec var_dump() où je mets en valeurs (gras) les données qui sont bien passées... et en couleur (rouge) celles qui se sont bousculées...


    // array CALENDRIER (extraits : tout est comme ça sur 6 mois)
    46 => string '2024-03-22:lib:White:id-x' (length=25)
    47 => string '2024-03-23:lib:White:id-x' (length=25)
    48 => string '2024-03-24:lib:White:id-x' (length=25)
    49 => string '2024-03-25:lib:White:id-x' (length=25)
    50 => string '2024-03-26:lib:White:id-x' (length=25)
    51 => string '2024-03-27:lib:White:id-x' (length=25)
    52 => string '2024-03-28:lib:White:id-x' (length=25)
    53 => string '2024-03-29:lib:White:id-x' (length=25)
    54 => string '2024-03-30:lib:White:id-x' (length=25)
    55 => string '2024-03-31:lib:White:id-x' (length=25)
    56 => string '2024-04-01:lib:White:id-x' (length=25)
    57 => string '2024-04-02:lib:White:id-x' (length=25)
    58 => string '2024-04-03:lib:White:id-x' (length=25)
    59 => string '2024-04-04:lib:White:id-x' (length=25)
    60 => string '2024-04-05:lib:White:id-x' (length=25)
    61 => string '2024-04-06:lib:White:id-x' (length=25)
    62 => string '2024-04-07:lib:White:id-x' (length=25)
    63 => string '2024-04-08:lib:White:id-x' (length=25)
    64 => string '2024-04-09:lib:White:id-x' (length=25)
    65 => string '2024-04-10:lib:White:id-x' (length=25)
    66 => string '2024-04-11:lib:White:id-x' (length=25)
    67 => string '2024-04-12:lib:White:id-x' (length=25)
    68 => string '2024-04-13:lib:White:id-x' (length=25)

    Le changement de mois (bleu gras) se fait bien


    // array OCCUP (extraits)

    ...
    48 => string '2024-03-24:oui:#DF0101:1217' (length=27)
    54 => string '2024-03-30:bleu2:#FE2E2E:1208' (length=29)
    55 => string '2024-03-31:bleu2:#FE2E2E:1208' (length=29)
    58 => string '2024-04-04:bleu2:#DF0101:1216' (length=29)
    59 => string '2024-04-05:bleu2:#DF0101:1216' (length=29)
    64 => string '2024-04-10:oui:#FE2E2E:1214' (length=27)
    65 => string '2024-04-11:oui:#FE2E2E:1214' (length=27)
    66 => string '2024-04-12:oui:#FE2E2E:1214' (length=27)
    ...

    // array CALENDRIER résultant de
    // $CALENDRIER = array_replace($BASE, $OCCUP);

    48 => string '2024-03-24:oui:#DF0101:1217' (length=27)
    49 => string '2024-03-25:lib:White:id-x' (length=25)
    50 => string '2024-03-26:lib:White:id-x' (length=25)
    51 => string '2024-03-27:lib:White:id-x' (length=25)
    52 => string '2024-03-28:lib:White:id-x' (length=25)
    53 => string '2024-03-29:lib:White:id-x' (length=25)
    54 => string '2024-03-30:bleu2:#FE2E2E:1208' (length=29)
    55 => string '2024-03-31:bleu2:#FE2E2E:1208' (length=29)
    56 => string '2024-04-01:lib:White:id-x' (length=25)
    57 => string '2024-04-02:lib:White:id-x' (length=25)
    58 => string '2024-04-04:bleu2:#DF0101:1216' (length=29)
    59 => string '2024-04-05:bleu2:#DF0101:1216' (length=29)
    60 => string '2024-04-05:lib:White:id-x' (length=25)
    61 => string '2024-04-06:lib:White:id-x' (length=25)
    62 => string '2024-04-07:lib:White:id-x' (length=25)
    63 => string '2024-04-08:lib:White:id-x' (length=25)
    64 => string '2024-04-10:oui:#FE2E2E:1214' (length=27)
    65 => string '2024-04-11:oui:#FE2E2E:1214' (length=27)
    66 => string '2024-04-12:oui:#FE2E2E:1214' (length=27)
    67 => string '2024-04-12:lib:White:id-x' (length=25)
    68 => string '2024-04-13:lib:White:id-x' (length=25)
    69 => string '2024-04-14:lib:White:id-x' (length=25)

    Jusqu'au 31 mars tout va bien.

    Puis le 1er avril (jour du poisson éponyme !!!) ça déraille :

    si la clé 57 est encore bonne avec la date 2024-04-02, la clé 58 qui devrait être datée 2024-04-03 se voit attribuer une date 2024-04-04 alors que dans $OCCUP elle avait bien la date 2024-04-03

    Je ne comprends pas, et j'ai passé pas mal de temps ce WE pour ajuster au niveau des clés.
    Si je veux que ça marche à partir du 1er avril... il suffit que j'augmente la clé de 1 quand je fais le foreach qui crée l'array $OCCUP mais dans ce cas les dates de mars sont fausses et se retrouvent en décalage.

    Pour info, le while sur le tableau mysqli puis la boucle for fabricant $OCCUP :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // depuis la requete mysqli
        while($r = mysqli_fetch_array($req))
            {
            $arr = $r['arrive'];
            $max = $r['nnuits'];
     
    /* puis j'attribue une donnée d'ensemble de la réserve en cours
        if($cl == 1){$col = "#DF0101"; $cl++;}else{$col="#FE2E2E"; $cl=1;}
    */
     
    // enfin je mesure le nbre de jours séparant $arr depuis aujourd'hui ($dhuip)
        $diff = (strtotime($arr) - strtotime($dhuip))/86400;
        $key = $diff;
     
    for ($t = 0; $t< $max; $t++)
    {
        $ndate = date('Y-m-d', strtotime($arr. ' + '.$t.' days'));
        $clef = (int)$key;
        $value = $ndate.":".$r['valid'].":".$col.":".$r['id'];
        $OCCUP[$clef] = $value;
        $key++;    
    }
    // mon array $OCCUP est maintenant correct avec comme origine de clé le aujourd'hui ($dhuip) comme ce qui a fait $BASE par ailleurs
    J'espère m'être exprimé clairement...
    Quelqu'un aurait-il une idée sur ce mystère en dehors d'un poisson d'avril (car cela continue ainsi -décalage de dates- jusqu'en novembre )
    Merci beaucoup d'avance pour vos efforts

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    que contient $dhuip ? aujourd'hui à minuit ? aujourd'hui à l'heure actuelle ?

  3. #3
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Juillet 2016
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Juillet 2016
    Messages : 75
    Points : 118
    Points
    118
    Par défaut Heure d'été ?
    Heure d'été dans la nuit du 30 au 31 ?
    C'est quand un homme voit un moustique posé sur un de ses testicules qu'il comprend que la violence ne peut pas résoudre tous les problèmes.

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut heure d'été
    Merci xor AX AX

    Heure d'été dans la nuit du 30 au 31 ?
    Il est bien possible que ce soit ça. Je viens d'inscrire des dates en novembre et elles ne buguent pas. Mais ça fait deux ans que ce calendrier fonctionne... et sans problème !!!
    Je regarde ça demain matin et je viendrai ici pour confirmer ou infirmer !

    A plus, gardez le fil.

  5. #5
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Juillet 2016
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Juillet 2016
    Messages : 75
    Points : 118
    Points
    118
    Par défaut Il y a aussi
    2024 année bissextile. Mais ton bug aura 1 mois de retard :-)
    C'est quand un homme voit un moustique posé sur un de ses testicules qu'il comprend que la violence ne peut pas résoudre tous les problèmes.

  6. #6
    Membre éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 386
    Points : 788
    Points
    788
    Par défaut
    je me disait qu'on se serait évité le problème en utilisant la date du jour pour indexer les objets.

  7. #7
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 165
    Points
    17 165
    Par défaut
    Salut
    À une époque où je relevais 5 données météo toutes les 10 minutes 24 heures sur 24, indexé jour/heure, tout ça en jour et heure local.
    Au bout de 3 ans, patatras, année bissextile ainsi que perte de données de 2 jours par an en dut au passage heure d'été /hiver.
    La solution, indexer jour/heure GMT.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  8. #8
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    2024 année bissextile. Mais ton bug aura 1 mois de retard :-)
    Tu pourrais avoir raison xor AX AX, mais pour ça je m'appuie sur dernier jour du mois = cal_days_in_month(CAL_GREGORIAN, $mois, $an); ce qui ne cause pas d'erreur sinon mars aurait aussi une erreur au cas où je n'aurais pas pris en considération les années bissextiles.

    Après avoir essayé de voir comment reprendre la structure des données de l'array() en jouant sur les dates , je bute forcément sur le fait que les clé sont responsables (pourquoi ? Mystère...).

    Aussi selon la suggestion de unanonyme et ProgElecT que je remercie chaleureusement, j'ai commencé à réviser mon code en prenant clé la date qui est unique puisqu'elle ne couvre qu'une seule valeur

    Je vais donc considérer ce sujet comme résolu (mais je le laisse encore jusqu'à demain si l'un ou l'autre d'entre vous a quelque chose à dire)

  9. #9
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Juillet 2016
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Juillet 2016
    Messages : 75
    Points : 118
    Points
    118
    Par défaut Je gère ce genre de problème avec mon client js
    Je développe actuellement la v2 d'une application qui peut ressembler à la tienne.

    Dans ce cas, mon API PHP ne gère que :
    1. l'authentification (mais ça reste à faire)
    2. l'envoi et la récupération de data sur les tables de ma base de données
    3. la mémorisation dans une table et dans $_SESSION du stamp (horodatage) des tables modifiées
    4. un 2ème script SSE qui analyse les stamps (table comparée à $_SESSION) pour déclencher l'envoi de données aux clients JS


    Mon PHP ne doit recevoir (j'ai encore du boulot à faire) que de l'UTC. Ce n'est pas à lui de faire le job de la localisation.

    Mon client JS fait le reste, comme gérer les locales date/time et donc n'envoyer au PHP que de l'UTC.
    C'est quand un homme voit un moustique posé sur un de ses testicules qu'il comprend que la violence ne peut pas résoudre tous les problèmes.

  10. #10
    Membre éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 386
    Points : 788
    Points
    788
    Par défaut
    pour moi c'est la conclusion de ce post, toujours travailler en UTC, toujours travailler en utf-8.
    Les localisations, les encodages, ça se gère en bout de chaîne.

Discussions similaires

  1. [PHP 5.0] Fonctionnement de la fonction "eval"
    Par falatop dans le forum Langage
    Réponses: 2
    Dernier message: 20/08/2009, 16h17
  2. [XL-2003] Fonctionnement d'une fonction de recherche
    Par IMPERIAL3187 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/04/2009, 18h42
  3. Fonctionnement de la fonction eval
    Par Didier100 dans le forum Langage
    Réponses: 2
    Dernier message: 17/03/2009, 08h32
  4. fonctionnement de la fonction codelock
    Par moncef357 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 29/08/2008, 13h46
  5. [PHP-JS] fonctionnement de la fonction 'header'
    Par enguerran dans le forum Langage
    Réponses: 8
    Dernier message: 02/06/2006, 08h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo