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 :

Accéder par calcul à une valeur d'un tableau associatif ?


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2005
    Messages : 70
    Points : 55
    Points
    55
    Par défaut Accéder par calcul à une valeur d'un tableau associatif ?
    J'ai un tableau associatif, du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $test = array ('zero'=>0,'un'=>1,'deux'=>2,'trois'=>3);
    Je dois absolument accéder à certaines de ses valeurs via un calcul de la position de ces valeurs dans le tableau, autrement dit par une séquence du type (c'est un exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $x = 2; echo 'test=' . $test [$x];
    Je fais comment ???
    ...sachant que je ne PEUX PAS passer par une fonction préliminaire d'indiçage utilisant "array_values" ou "array_keys".

    Accessoirement : y-a-t-il oui ou non une notion d'ordre en arrière-plan d'un tableau associatif (ce qui me paraît logique, vu l'existence de la fonction array_values !).

    Ben merci à tous !

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Il faudrait inverser les clés et les valeurs en ce cas, ie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $test = array(/*0 => */'zero', /*1 => */'un', /* 2 => */'deux', /* 3 => */'trois');
    L'ordre (foreach & co) d'un tableau associatif est celui de ses insertions (les éléments en interne étant doublement chaînés globalement, avec ajout en queue - en plus de celle au niveau de chaque bucket pour gérer les collisions).

  3. #3
    Membre du Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2005
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par julp Voir le message
    Il faudrait inverser les clés et les valeurs en ce cas, ie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $test = array(/*0 => */'zero', /*1 => */'un', /* 2 => */'deux', /* 3 => */'trois');
    L'ordre (foreach & co) d'un tableau associatif est celui de ses insertions (les éléments en interne étant doublement chaînés globalement, avec ajout en queue - en plus de celle au niveau de chaque bucket pour gérer les collisions).
    Ben... ça peut pas marcher ! Si mon tableau est créé en format associatif, c'est parce qu'il subit un pré-traitement basé sur ce format. Dans la foulée, je lui applique un second traitement qui, lui, nécessite un accès à certaines valeurs, sélectionnées par un calcul sur leur rang/index...

    Je n'arrive pas à comprendre pourquoi l'accès "indiciel" aux valeurs n'est pas implémenté, en arrière-plan de l'accès "associatif". Ce serait tellement plus simple...

    Merci quand même.

  4. #4
    Membre du Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2005
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    Je travaille sur 16 tableaux numériques à 1 dimension, chaque tableau ayant une longueur variable (de 2 à 7). Il y a 72 valeurs au total.

    Ces tableaux sont édités en JavaScript. La validation génère un cookie qui range les valeurs linéairement :
    s0=3&s1=8&s2=12&s3=14&s4=44& ... s71=24

    En PHP, je relis le cookie et range les valeurs dans 16 tableaux associatifs, de la forme :
    array aaaa = ("s0"=>3,"s1"=>8,"s2"=>12)
    array bbbb = ("s3"=>14,"s4"=>44) etc ...

    Le pb : je dois ensuite accéder à certaines valeurs de chacun des tableaux via un calcul numérique assez complexe qui me donne le rang de la valeur à sélectionner. Pour "aaaa", si mon calcul produit 2, je veux accéder à la valeur 12, voilà !

    Merci de vos lumières...

  5. #5
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Points : 354
    Points
    354
    Par défaut
    Peut être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $calcul = ton_calcul();
    $valeur = $aaaa["s".$calcul];
    ?

  6. #6
    Membre du Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2005
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par Climoo Voir le message
    Peut être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $calcul = ton_calcul();
    $valeur = $aaaa["s".$calcul];
    ?
    Ca n'est pas mission impossible, mais ça m'oblige à maintenir une table qui m'indique en quelle position démarre chacun des 16 tableaux !

    Je n'arrive vraiment pas à comprendre pourquoi l'accès "indiciel" à un tableau associatif n'est pas implémenté en PHP ! D'autant que les tableaux associatifs, conceptuellement parlant, ne sont qu'une sur-couche des arrays classiques. C'est quand même pas un calcul de pointeurs lié à la taille variable des clefs qui peut poser problème, non ?! D'ailleurs le "print_r" s'en tire très bien, en affichage....

    Merci à vous

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonsoir,

    au pire tu crées toi-même ce qui te manque. Quelque chose comme ça :
    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
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    class IndexedArray
       implements \ArrayAccess, \Iterator, \Countable
    {
       /**
        * @var array Array(key => value)
        */
       private $values = array();
     
       /**
        * @param array $p
        * @return IndexedArray
        */
       public function __construct(array $p) {
          foreach($p as $k => $v) {
             $this->offsetSet($k, $v);
          }
       }
     
       /**
        * ARRAYACCESS INTERFACE
        */
       public function offsetExists($offset) {
          if (array_key_exists($offset, $this->values)) {
             return true;
          }
          return (is_numeric($offset)) ? ($offset < count($this->values)) : false;
       }
     
       public function offsetGet($offset) {
          if (array_key_exists($offset, $this->values)) {
             return $this->values[$offset];
          }
          if (is_numeric($offset)) {
             $keys = array_keys($this->values);
             if ($offset < count($keys)) {
                $i = -1;
                foreach($this->values as $value) {
                   if (++$i === $offset) {
                      return $value;
                   }
                }
             }
          }
       }
     
       public function offsetSet($offset, $value) {
          $this->values[$offset] = $value;
       }
     
       public function offsetUnset($offset) {
          if (array_key_exists($offset, $this->values)) {
             unset($this->values[$offset]);
          }
          else
          if (is_numeric($offset)) {
             $keys = array_keys($this->values);
             if ($offset < count($keys)) {
                $i = -1;
                foreach($this->values as $key => $value) {
                   if (++$i === $offset) {
                      unset($this->values[$key]);
                      break;
                   }
                }
             }
          }
       }
     
       /**
        * ITERATOR INTERFACE
        */
       public function current() {
          return current($this->values);
       }
     
       public function key() {
          return key($this->values);
       }
     
       public function next() {
          return next($this->values);
       }
     
       public function rewind() {
          reset($this->values);
       }
     
       public function valid() {
          return (false !== $this->key());
       }
     
       /**
        * COUNTABLE INTERFACE
        */
       public function count() {
          return count($this->values);
       }
    }
     
    $a = new IndexedArray(array("s0"=>3,"s1"=>8,"s2"=>12));
    $b = $a[2]; // $b = 12
    ?>

  8. #8
    Membre du Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2005
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Bonsoir,

    au pire tu crées toi-même ce qui te manque. Quelque chose comme ça :
    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
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    class IndexedArray
       implements \ArrayAccess, \Iterator, \Countable
    {
       /**
        * @var array Array(key => value)
        */
       private $values = array();
     
       /**
        * @param array $p
        * @return IndexedArray
        */
       public function __construct(array $p) {
          foreach($p as $k => $v) {
             $this->offsetSet($k, $v);
          }
       }
     
       /**
        * ARRAYACCESS INTERFACE
        */
       public function offsetExists($offset) {
          if (array_key_exists($offset, $this->values)) {
             return true;
          }
          return (is_numeric($offset)) ? ($offset < count($this->values)) : false;
       }
     
       public function offsetGet($offset) {
          if (array_key_exists($offset, $this->values)) {
             return $this->values[$offset];
          }
          if (is_numeric($offset)) {
             $keys = array_keys($this->values);
             if ($offset < count($keys)) {
                $i = -1;
                foreach($this->values as $value) {
                   if (++$i === $offset) {
                      return $value;
                   }
                }
             }
          }
       }
     
       public function offsetSet($offset, $value) {
          $this->values[$offset] = $value;
       }
     
       public function offsetUnset($offset) {
          if (array_key_exists($offset, $this->values)) {
             unset($this->values[$offset]);
          }
          else
          if (is_numeric($offset)) {
             $keys = array_keys($this->values);
             if ($offset < count($keys)) {
                $i = -1;
                foreach($this->values as $key => $value) {
                   if (++$i === $offset) {
                      unset($this->values[$key]);
                      break;
                   }
                }
             }
          }
       }
     
       /**
        * ITERATOR INTERFACE
        */
       public function current() {
          return current($this->values);
       }
     
       public function key() {
          return key($this->values);
       }
     
       public function next() {
          return next($this->values);
       }
     
       public function rewind() {
          reset($this->values);
       }
     
       public function valid() {
          return (false !== $this->key());
       }
     
       /**
        * COUNTABLE INTERFACE
        */
       public function count() {
          return count($this->values);
       }
    }
     
    $a = new IndexedArray(array("s0"=>3,"s1"=>8,"s2"=>12));
    $b = $a[2]; // $b = 12
    ?>
    Superbe ! C'est ce qu'il me fallait. Je suis trop newbie en PHP, je n'aurais pas trouvé ça tout seul.

    Mais honnêtement, je ne comprends toujours pas pourquoi tout ou partie de ces fonction(s) ne sont pas implémentées.

    Merci Encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Accéder à une valeur d'un tableau multidimensionel
    Par pasqual dans le forum Langage
    Réponses: 1
    Dernier message: 23/11/2009, 10h50
  2. Réponses: 7
    Dernier message: 03/10/2008, 12h37
  3. Réponses: 1
    Dernier message: 25/09/2008, 17h07
  4. Accéder à une valeur d'un tableau dynamiquement
    Par Le_PounK dans le forum Struts 1
    Réponses: 2
    Dernier message: 23/03/2007, 14h35
  5. Accéder à une valeur d'un tableau associatif
    Par TigreRouge dans le forum Langage
    Réponses: 5
    Dernier message: 16/03/2006, 13h03

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