Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

ordre des paires dans un tableau

0 views
Skip to first unread message

Olivier Masson

unread,
Jan 7, 2010, 12:36:15 PM1/7/10
to
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

unread,
Jan 7, 2010, 2:52:14 PM1/7/10
to
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

Olivier Miakinen

unread,
Jan 7, 2010, 2:52:48 PM1/7/10
to
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()).

Olivier Miakinen

unread,
Jan 7, 2010, 3:03:50 PM1/7/10
to
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>

Olivier Miakinen

unread,
Jan 7, 2010, 3:08:11 PM1/7/10
to
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

Olivier Masson

unread,
Jan 8, 2010, 5:00:11 AM1/8/10
to
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.

Olivier Masson

unread,
Jan 8, 2010, 5:00:11 AM1/8/10
to
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�.

Mickael Wolff

unread,
Jan 8, 2010, 2:20:50 PM1/8/10
to
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

Olivier Masson

unread,
Jan 9, 2010, 5:04:02 PM1/9/10
to
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.

0 new messages