Discussion:
ordre des paires dans un tableau
(trop ancien pour répondre)
Olivier Masson
2010-01-07 17:36:15 UTC
Permalink
Bonjour,

Afin de choisir une valeur par défaut, j'ai besoin de récupérer la
première clef d'un tableau.

Donc j'ai :
$a = array( 'foo'=>'bar' , 'alice'=>'bob );

Je fais une recherche parmi les clefs, mais si je ne trouve rien, je
veux la première du tableau.

Par exemple je demande :
array_key_exists('zut',$a);
et je voudrais en retour :
foo

Je n'ai pas trouvé d'autres moyens que d'utiliser array_keys :
$x = array_keys($a); // ne pouvant faire $x = array_keys($a)[0]
echo $x[0]; // ma clef par défaut étant la première


Mais est-ce fiable ? Car je n'ai vu nulle part dans la doc que l'ordre
des paires était conservé.
Donc est-ce que array_values (ou keys) maintient toujours l'ordre
définit à la création du tableau ?

Ou existe-t-il une solution plus élégante/juste ?

Merci.
Pascal
2010-01-07 19:52:14 UTC
Permalink
Post by Olivier Masson
Bonjour,
Bonjour,
Post by Olivier Masson
Afin de choisir une valeur par défaut, j'ai besoin de récupérer la
première clef d'un tableau.
Qui dit "première" dit ordonnancement, donc tableau indexé.
Post by Olivier Masson
$a = array( 'foo'=>'bar' , 'alice'=>'bob );
Et là je vois un tableau associatif ???
Post by Olivier Masson
Mais est-ce fiable ? Car je n'ai vu nulle part dans la doc que l'ordre
des paires était conservé.
D'où la problématique qui est peut-être due à une incohérence de départ.
Post by Olivier Masson
Donc est-ce que array_values (ou keys) maintient toujours l'ordre
définit à la création du tableau ?
Ou existe-t-il une solution plus élégante/juste ?
Si vraiment il faut gérer des couples nom/valeur tout en gardant un
ordonnancement, la solution est peut-être d'utiliser une dimension
supplémentaire.

Dans l'exemple, ça donnerait :
<?php
$a = array(
array('foo', 'bar'),
array('alice', 'bob')
);
?>

Cordialement,
Pascal
Olivier Miakinen
2010-01-07 20:08:11 UTC
Permalink
Post by Pascal
Post by Olivier Masson
Afin de choisir une valeur par défaut, j'ai besoin de récupérer la
première clef d'un tableau.
Qui dit "première" dit ordonnancement, donc tableau indexé.
Justement non. Un tableau PHP garde déjà l'ordre d'insertion des
éléments, indépendamment des index utilisés.

Il suffit de voir à quoi ressemble le résultat d'un each(), et l'ordre
de ses éléments, pour se convaincre que cet ordre est complètement
indépendant des numéros d'index :

<http://fr2.php.net/manual/fr/function.each.php>
print_r($bar);

Array
(
[1] => bob
[value] => bob
[0] => 0
[key] => 0
)
</>

Cordialement,
--
Olivier Miakinen
Olivier Masson
2010-01-08 10:00:11 UTC
Permalink
Post by Pascal
D'où la problématique qui est peut-être due à une incohérence de départ.
Je ne pense pas : c'est une utilisation dans un select. Les "value" de
l'option sont les valeurs du tableau, les clefs sont affectées aux for/id.
On ne peut affecter les valeurs de tableaux également aux id puisque ces
derniers n'acceptent pas tous types de caractères.
Et il me faut quelque chose d'explicite et spécifique, donc pas de
nombre (ce qui est interdit) ni de truc comme "p0".
Post by Pascal
Si vraiment il faut gérer des couples nom/valeur tout en gardant un
ordonnancement, la solution est peut-être d'utiliser une dimension
supplémentaire.
C'est bien ce que je souhaite éviter puisque je fais tout ça pour avoir
une bonne lisibilité.
Olivier Miakinen
2010-01-07 19:52:48 UTC
Permalink
Post by Olivier Masson
Afin de choisir une valeur par défaut, j'ai besoin de récupérer la
première clef d'un tableau.
$a = array( 'foo'=>'bar' , 'alice'=>'bob );
Je fais une recherche parmi les clefs, mais si je ne trouve rien, je
veux la première du tableau.
array_key_exists('zut',$a);
foo
$x = array_keys($a); // ne pouvant faire $x = array_keys($a)[0]
echo $x[0]; // ma clef par défaut étant la première
Je ne les ai jamais utilisées car j'ai commencé à coder en PHP alors que
l'instruction foreach existait déjà, mais je pense que les fonctions
reset() et each() devraient faire ton bonheur :
http://fr2.php.net/manual/fr/function.reset.php
http://fr2.php.net/manual/fr/function.each.php
Post by Olivier Masson
Mais est-ce fiable ? Car je n'ai vu nulle part dans la doc que l'ordre
des paires était conservé.
Ce que l'on voit dans la doc de certaines fonctions, c'est le cas où
justement elles détruisent l'ordre des entrées du tableau. On peut
donc supposer que dans tous les cas où ils ne disent rien l'ordre est
préservé...

Les deux commentaires suivants confirment ce sentiment :
http://fr2.php.net/manual/fr/function.array-reverse.php#4178
Post by Olivier Masson
Ou existe-t-il une solution plus élégante/juste ?
Cf. supra (reset() + each()).
Olivier Miakinen
2010-01-07 20:03:50 UTC
Permalink
Post by Olivier Miakinen
Je ne les ai jamais utilisées car j'ai commencé à coder en PHP alors que
l'instruction foreach existait déjà, mais je pense que les fonctions
Il y a même beaucoup plus simple ! Puisque tu ne veux que la première
valeur et pas son index, il te suffit d'utiliser current(). Du coup,
puisque contrairement à each() il n'incrémente pas le pointeur de
tableau, tu n'as probablement pas besoin de reset().

<http://fr2.php.net/manual/fr/function.current.php>
Olivier Masson
2010-01-08 10:00:11 UTC
Permalink
Post by Olivier Miakinen
Je ne les ai jamais utilisées car j'ai commencé à coder en PHP alors que
l'instruction foreach existait déjà, mais je pense que les fonctions
http://fr2.php.net/manual/fr/function.reset.php
http://fr2.php.net/manual/fr/function.each.php
Effectivement. Je n'ai jamais non plus.
Post by Olivier Miakinen
http://fr2.php.net/manual/fr/function.array-reverse.php#4178
En effet ?
Le commentaire que tu pointes ne m'aurait pas forcément persuadé mais il
semble évident que si on peut faire un array_reverse, c'est bien que les
paires sont ordonnées.

Bonne idée pour le current() que tu indiques par ailleurs (mais je
préfères considérer que je peux changer la position du choix par défaut).

Merci.
Mickael Wolff
2010-01-08 19:20:50 UTC
Permalink
Post by Olivier Masson
Bonne idée pour le current() que tu indiques par ailleurs (mais je
préfères considérer que je peux changer la position du choix par défaut).
Dans ce cas on peut utiliser array_slice. Mais il a l'effet de bord
de réinitialiser le curseur du tableau.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Olivier Masson
2010-01-09 22:04:02 UTC
Permalink
Dans ce cas on peut utiliser array_slice. Mais il a l'effet de bord de
réinitialiser le curseur du tableau.
Ah oui tiens. Parfois je me demande à quoi peuvent servir certains
fonctions mais je les oublie ensuite.
Merci.

Continuer la lecture sur narkive:
Loading...