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 :

Pourquoi mon array est de type ou des fois objet


Sujet :

Langage PHP

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 214
    Par défaut Pourquoi mon array est de type ou des fois objet
    Bonjour à tous

    J'ai un petit problème récurant...

    Je questionne une base de donnée pour collecter les positions de station pour plusieurs terrain.
    Le but est de connaitre le points GPS central des stations par terrain, pour que ma map soit centralisée au milieu de toutes les stations.

    J'ai donc, pour résultat, un array comme celui-ci

    Code PHP : 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
    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
     
    Array
    (
        [0] => Array
            (
                [0] => Array
                    (
                        [0] => 46.173393
                        [1] => 6.004297
                    )
     
                [1] => Array
                    (
                        [0] => 46.185722
                        [1] => 5.997623
                    )
     
                [2] => Array
                    (
                        [0] => 46.172840
                        [1] => 6.002612
                    )
     
            )
     
        [1] => Array
            (
                [0] => Array
                    (
                        [0] => 46.173393
                        [1] => 6.004297
                    )
     
                [1] => Array
                    (
                        [0] => 46.172840
                        [1] => 6.002612
                    )
     
            )
     
        [2] => Array
            (
                [0] => Array
                    (
                        [0] => 46.185722
                        [1] => 5.997623
                    )
     
            )
     
    )

    L'index 0: Représente la position de toutes les stations de tous les terrains
    L'index 1: repreésente la position des stations du terrain 1
    L'index 2: représente la position des stations du terrain 2

    Au passsage, si je désactive la station 1, j'aurai le meme array mais sans l'index 1. Ca causera un problème au niveau PHP et javascript?

    Revenons. Puis pour connaitre le point central des stations, je passe cet array dans un fonction GetCenterFromDegrees()

    Code PHP : 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    <?php
    function GetCenterFromDegrees($data){
     
        if (!is_array($data)) 
        {
            echo "Error: Is not a array in GetCenterFromDegrees($data)";
            return FALSE;
        }
     
        $num_coords = count($data);
     
        $X = 0.0;
        $Y = 0.0;
        $Z = 0.0;
     
        foreach ($data as $coord){
     
            $lat = deg2rad((float)$coord[0]);
            $lon = deg2rad((float)$coord[1]);
     
            $a = cos($lat) * cos($lon);
            $b = cos($lat) * sin($lon);
            $c = sin($lat);
     
            $X += $a;
            $Y += $b;
            $Z += $c;
        }
     
        $X /= $num_coords;
        $Y /= $num_coords;
        $Z /= $num_coords;
     
        $lon = atan2($Y, $X);
        $hyp = sqrt($X * $X + $Y * $Y);
        $lat = atan2($Z, $hyp);
     
        return array(rad2deg($lat), rad2deg($lon));
    }
    ?>

    Quand le script est exécuté, les valeurs désirées sont retournées sous le format JSON pour que mon code javascript (AJAX) puisse affichée les positions sur ma map (openstreetmap).

    Je suis en train de désactiver des stations car la saison de mesures est terminée et je constate un bug que je viens de comprendre sans savoir pourquoi il se produit.

    Par exemple, quand j'ai que deux stations actives, j'ai une erreur, quand j'en ai trois, j'ai pas d'erreur. Je suis donc aller plus lion et j'ai constaté que quand j'ai deux stations actives mon json à ce format (regarder sous map_center)

    Code JSON : Sélectionner tout - Visualiser dans une fenêtre à part
    {"properties":[{"id_station":21,"id_field":2,"field":"hutins","station":"Station m\u00e9t\u00e9o","type":3,"archive":0,"la":46.185722,"lo":5.997623,"da":"2021-07-02 09:26:51","al":581,"b1":null,"b2":null,"b3":null,"b4":null,"se":null,"su":531,"an":0,"sb":null,"sl":null,"te":19,"hu":69,"pr":97},{"id_station":22,"id_field":1,"field":"printaniere","station":"Station m\u00e9t\u00e9o","type":3,"archive":0,"la":46.17284,"lo":6.002612,"da":"2021-07-02 09:18:01","al":400,"b1":null,"b2":null,"b3":null,"b4":null,"se":null,"su":409,"an":0,"sb":null,"sl":null,"te":22,"hu":71,"pr":97}],"map_center":{"0":[46.1792810271279,6.000117792211173],"2":[46.185722,5.997623],"1":[46.172839999999994,6.002612000000001]}}

    et quand j'ai trois stations active j'ai ce format
    Code JSON : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    {"properties":[{"id_station":6,"id_field":1,"field":"printaniere","station":"ST Bourgeon 6","type":1,"archive":0,"la":46.173393,"lo":6.004297,"da":"2021-07-02 09:44:20","al":460,"b1":24.2,"b2":null,"b3":null,"b4":25.8,"se":null,"su":null,"an":null,"sb":null,"sl":null,"te":null,"hu":null,"pr":null},{"id_station":21,"id_field":2,"field":"hutins","station":"Station m\u00e9t\u00e9o","type":3,"archive":0,"la":46.185722,"lo":5.997623,"da":"2021-07-02 09:39:41","al":581,"b1":null,"b2":null,"b3":null,"b4":null,"se":null,"su":563,"an":6.4,"sb":null,"sl":null,"te":21,"hu":61,"pr":97},{"id_station":22,"id_field":1,"field":"printaniere","station":"Station m\u00e9t\u00e9o","type":3,"archive":0,"la":46.17284,"lo":6.002612,"da":"2021-07-02 09:43:45","al":400,"b1":null,"b2":null,"b3":null,"b4":null,"se":null,"su":467,"an":0,"sb":null,"sl":null,"te":21,"hu":74,"pr":97}],"map_center":[[46.1773183683321,6.001510960923161],[46.173116503094505,6.003454495764238],[46.185722,5.997623]]}

    On voit bien que dans le premier cas, j'ai ceci, ce qui est faut

    Code JSON : Sélectionner tout - Visualiser dans une fenêtre à part
    "map_center":{"0":[46.1792810271279,6.000117792211173],"2":[46.185722,5.997623],"1":[46.172839999999994,6.002612000000001]}

    et dans le deuxième, car j'ai la format qui fonctionne

    Code JSON : Sélectionner tout - Visualiser dans une fenêtre à part
    "map_center":[[46.1773183683321,6.001510960923161],[46.173116503094505,6.003454495764238],[46.185722,5.997623]]

    Pourquoi?

    La chaine retorunée, soit map_center, doit toujours est un array, et donc jamais un objet.

    Pour mieux m'aider à comprendre, je vous donne des extrait de codes.

    Je sauve mes positions dans une variable 'positions' (C'est l'array que je donne, tout en-haut).

    Puis je le passe dans un foreach, et a chaque boucle, il appelle le fonction GetCenterFromDegrees, qui va calculer le centre

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     foreach($positions as $key => $val){
        	$geojson['map_center'][$key]= GetCenterFromDegrees($positions[$key]);
     }

    ce qui va ajouter à mon array geojson, l'index 'map_center'.

    Puis, j'ai une dernière fonction qui va me retoruner tout ceci à mon script javascript au format json

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    echo json_encode($geojson, JSON_NUMERIC_CHECK);

    Je ne comprends pas pourquoi

    1. A quel moment ce biz se produit (serait-ce dans le foreach?)
    2. map_center est dans un cas un objet, et dans l'autre une array


    Pourriez-vous me guider, en espérant avoir fourni assez d'information

    Milles mercis

    edit:
    L'array pour deux stations actives ressemble à ceci


    Code PHP : 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
        [0] => Array
            (
                [0] => Array
                    (
                        [0] => 46.185722
                        [1] => 5.997623
                    )
     
                [1] => Array
                    (
                        [0] => 46.172840
                        [1] => 6.002612
                    )
     
            )
     
        [2] => Array
            (
                [0] => Array
                    (
                        [0] => 46.185722
                        [1] => 5.997623
                    )
     
            )
     
        [1] => Array
            (
                [0] => Array
                    (
                        [0] => 46.172840
                        [1] => 6.002612
                    )
     
            )
     
    )

    Je constate que l'ordre n'est pas le même (0,2,1), serait-ce la cause?

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 214
    Par défaut
    En effet, ca résolu mon problème,
    mais j'ai activé mon terrain 4 qui a deux stations, et je problème se reproduit car

    Code PHP : 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
    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
    64
    65
    66
    67
    Array
    (
        [0] => Array
            (
                [0] => Array
                    (
                        [0] => 46.172840
                        [1] => 6.002612
                    )
     
                [1] => Array
                    (
                        [0] => 46.185722
                        [1] => 5.997623
                    )
     
                [2] => Array
                    (
                        [0] => 46.217743
                        [1] => 6.013987
                    )
     
                [3] => Array
                    (
                        [0] => 46.217739
                        [1] => 6.013980
                    )
     
            )
     
        [1] => Array
            (
                [0] => Array
                    (
                        [0] => 46.172840
                        [1] => 6.002612
                    )
     
            )
     
        [2] => Array
            (
                [0] => Array
                    (
                        [0] => 46.185722
                        [1] => 5.997623
                    )
     
            )
     
        [4] => Array
            (
                [0] => Array
                    (
                        [0] => 46.217743
                        [1] => 6.013987
                    )
     
                [1] => Array
                    (
                        [0] => 46.217739
                        [1] => 6.013980
                    )
     
            )
     
    )

    Est-ce que je peux forcer que cela soit toujours retourner en array, et pas en objet, meme s'il y a des sauts dans le terrain actuf? (Ci dessus, il y a les terrains 1,2 et 4 actifs)

    Merci

  3. #3
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 369
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 369
    Billets dans le blog
    17
    Par défaut
    Est-ce que je peux forcer que cela soit toujours retourner en array, et pas en objet, meme s'il y a des sauts dans le terrain actuf? (Ci dessus, il y a les terrains 1,2 et 4 actifs)
    Si un tableau n'est pas séquentiel (indexé de 0 à x sans trou) alors il est considéré comme un associatif, et un associatif est codé en objet JSON et non en tableau.

    Il faut donc que tu évites les trous => Idéalement à voir quand tu crées ton tableau

    Ou que tu "combles" les trous en réindexant ton tableau, exemple avec array_values() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $data = [0 => 'elem-0', 1 => 'elem-1', 3 => 'elem-3']; // Pas d'élément d'index 2
    $data = array_values($data); // Réindexation
    print_r($data); // [0 => 'elem-0', 1 => 'elem-1', 2 => 'elem-3]

Discussions similaires

  1. Pourquoi mon array est mal déclaré
    Par pierrot10 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/02/2021, 18h01
  2. Pourquoi mon code est plus lent que Arrays.sort
    Par alexis779 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/12/2006, 13h44
  3. Réponses: 6
    Dernier message: 19/11/2006, 01h41
  4. [DataAdapter] Pourquoi mon Update est chaotique ?
    Par hm@rch@1 dans le forum Framework .NET
    Réponses: 5
    Dernier message: 17/08/2006, 11h03
  5. [Plugin][VE]pourquoi la fenetre est dans la barre des taches
    Par voyageur dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 15/06/2005, 09h59

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