Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
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 22/12/2011, 18h41   #1
Invité de passage
 
Inscription : juin 2005
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 21
Points : 2
Points : 2
Par défaut Accéder par calcul à une valeur d'un tableau associatif ?

J'ai un tableau associatif, du genre :
Code :
$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 :
$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 !
puresprit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 19h13   #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
Il faudrait inverser les clés et les valeurs en ce cas, ie :
Code :
$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).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 19h54   #3
Invité de passage
 
Inscription : juin 2005
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 21
Points : 2
Points : 2
Citation:
Envoyé par julp Voir le message
Il faudrait inverser les clés et les valeurs en ce cas, ie :
Code :
$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.
puresprit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 20h38   #4
Invité de passage
 
Inscription : juin 2005
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 21
Points : 2
Points : 2
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...
puresprit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 20h48   #5
Membre confirmé
 
Homme Clément
Développeur informatique
Inscription : décembre 2006
Messages : 213
Détails du profil
Informations personnelles :
Nom : Homme Clément
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : décembre 2006
Messages : 213
Points : 277
Points : 277
Peut être :
Code :
1
2
3
 
$calcul = ton_calcul();
$valeur = $aaaa["s".$calcul];
?
Climoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 21h23   #6
Invité de passage
 
Inscription : juin 2005
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 21
Points : 2
Points : 2
Citation:
Envoyé par Climoo Voir le message
Peut être :
Code :
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
puresprit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 00h19   #7
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Bonsoir,

au pire tu crées toi-même ce qui te manque. Quelque chose comme ç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
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
?>
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 08h40   #8
Invité de passage
 
Inscription : juin 2005
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 21
Points : 2
Points : 2
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 :
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 !
puresprit 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 20h54.


 
 
 
 
Partenaires

Hébergement Web