Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

ordre des paires dans un tableau

8 réponses
Avatar
Olivier Masson
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.

8 réponses

Avatar
Pascal
Olivier Masson a écrit :
Bonjour,



Bonjour,

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é.

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



Et là je vois un tableau associatif ???

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.

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
Avatar
Olivier Miakinen
Le 07/01/2010 18:36, Olivier Masson a écrit :

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



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

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

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



Cf. supra (reset() + each()).
Avatar
Olivier Miakinen
Le 07/01/2010 20:52, je répondais à Olivier Masson :

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 :



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>
Avatar
Olivier Miakinen
Le 07/01/2010 20:52, Pascal répondait à 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
Avatar
Olivier Masson
Le 07/01/2010 20:52, Olivier Miakinen a écrit :

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




Effectivement. Je n'ai jamais non plus.


Les deux commentaires suivants confirment ce sentiment :
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.
Avatar
Olivier Masson
Le 07/01/2010 20:52, Pascal a écrit :

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".


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é.
Avatar
Mickael Wolff
Olivier Masson a écrit :

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
Avatar
Olivier Masson
Le 08/01/2010 20:20, Mickael Wolff a écrit :

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.