Discussion:
[Debutant] Comparaison
(trop ancien pour répondre)
Pascale
2007-09-24 15:14:43 UTC
Permalink
Bonjour à tous,

Désolée si la question est niveau neuneu, mais je trouve pas la réponse. Je
cherche simplement à savoir si une valeur se trouve parmi une liste.
Je pourrais bien sûr écrire :

if (($pays=='France') OR ($pays=='Allemagne') OR ($pays=='Italie) OR [...]

...
Mais y a-t-il moyen d'abréger un peu (j'ai toute une liste de pays) ? J'ai
essayé :

if ($pays==('France' OR 'Allemagne' OR 'Italie'))

mais comme je m'y attendais, ça ne marche pas.
Je n'ai pas trouvé de réponse dans le manuel PHP... Y en a-t-il une ?
--
Pascale
Claude
2007-09-24 15:46:07 UTC
Permalink
Le plus simple serait d'avoir les pays dans une table et de faire une
requete.
Post by Pascale
Bonjour à tous,
Désolée si la question est niveau neuneu, mais je trouve pas la réponse. Je
cherche simplement à savoir si une valeur se trouve parmi une liste.
if (($pays=='France') OR ($pays=='Allemagne') OR ($pays=='Italie) OR [...]
...
Mais y a-t-il moyen d'abréger un peu (j'ai toute une liste de pays) ? J'ai
if ($pays==('France' OR 'Allemagne' OR 'Italie'))
mais comme je m'y attendais, ça ne marche pas.
Je n'ai pas trouvé de réponse dans le manuel PHP... Y en a-t-il une ?
Mickael Wolff
2007-09-24 15:46:07 UTC
Permalink
Post by Pascale
mais comme je m'y attendais, ça ne marche pas.
Je n'ai pas trouvé de réponse dans le manuel PHP... Y en a-t-il une ?
if ($pays==('France' OR 'Allemagne' OR 'Italie'))
Une astuce consiste à utiliser un tableau :

if(in_array($pays, array('France', 'Allemagne', 'Italie'))
{
/* code ici */
}

ou encore d'utiliser la structure switch :

switch($pays)
{
case 'France' :
case 'Allemagne' :
case 'Italie' :
/* code ici */
break ;
default:
}

Ça dépendra aussi de la logique qu'il y a derrière.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Stephan Peccini
2007-09-24 15:46:07 UTC
Permalink
Post by Pascale
if ($pays==('France' OR 'Allemagne' OR 'Italie'))
mais comme je m'y attendais, ça ne marche pas.
Je n'ai pas trouvé de réponse dans le manuel PHP... Y en a-t-il une ?
Peut-être que cela correspond à l'attente (mais je ne sais pas si c'est le
plus efficace pour répondre à la question) :
http://www.php.net/manual/fr/function.in-array.php
--
Stéphan Peccini
Les photos : <URL:http://photonature.fr>
Les Pyrénées : <URL:http://photonature.fr/pyrenees>
Le blog : <URL:http://pyrenees.peccini.fr>
Pascale
2007-09-24 17:28:54 UTC
Permalink
Post by Stephan Peccini
Peut-être que cela correspond à l'attente (mais je ne sais pas si
http://www.php.net/manual/fr/function.in-array.php
Oui oui et re-oui, le temps que ma question soit publiée j'étais tombée moi
aussi sur in_array qui correspond parfaitement à ce que je veux. Pourtant
j'avais bien cherché avant de poster...

Merci à tous et je vous fais toutes mes excuses de vous avoir fait chercher
pour rien.
--
Pascale
John GALLET
2007-09-24 18:25:12 UTC
Permalink
Bonsoir/jour,
Pourtant j'avais bien cherché avant de poster...
S'il y a bien une caractéristique donnant un avantage énorme de PHP sur
d'autres plateformes, c'est la richesse de ses API natives, en particulier
les fonctions de gestion de strings et de tableaux. Il est rare qu'on ne
dispose pas directement de ce dont on a besoin, au pire en combinant deux
ou trois fonctions existantes.

C'est à double tranchant, car il y a en a tellement qu'on s'y perd. Y
compris des trucs inutilement compliqués comme par exemple array_walk(),
qui permet de passer 5 bonnes minutes à se gratter le neurone devant le
man en ne comprenant strictement rien à ce qu'on lit alors qu'un bête
foreach() fait aussi bien le boulot.

Là aussi, in_array() peut dans certains cas être remplacé par in
array_key_exists() n'est qu'un bon vieux if(isset(...)) si on joue pas
avec le NULL de php. Et si on a envie de se re-demander si php est ou non
un langage typé, on peut jouer avec array_search().

a++;
JG
Pascale
2007-09-25 07:40:04 UTC
Permalink
Post by John GALLET
S'il y a bien une caractéristique donnant un avantage énorme de PHP
sur d'autres plateformes, c'est la richesse de ses API natives, en
particulier les fonctions de gestion de strings et de tableaux. Il est
rare qu'on ne dispose pas directement de ce dont on a besoin, au pire
en combinant deux ou trois fonctions existantes.
Exact !
Post by John GALLET
C'est à double tranchant, car il y a en a tellement qu'on s'y perd. Y
compris des trucs inutilement compliqués comme par exemple
array_walk(), qui permet de passer 5 bonnes minutes à se gratter le
neurone devant le man en ne comprenant strictement rien à ce qu'on lit
alors qu'un bête foreach() fait aussi bien le boulot.
Et oui ! Je me sens comme un apprenti inexpérimenté qui aurait à sa
disposition tous les outils d'un maître-artisan, et embarrassée de savoir
lequel ira le mieux pour ce que je veux faire... et quelquefois je trouve
facilement dans les exemples comment faire des trucs compliqués... mais pas
Post by John GALLET
Là aussi, in_array() peut dans certains cas être remplacé par in
array_key_exists() n'est qu'un bon vieux if(isset(...)) si on joue pas
avec le NULL de php. Et si on a envie de se re-demander si php est ou
non un langage typé, on peut jouer avec array_search().
Gloups... un langage typé, ça veut dire quoi ?
--
Pascale
Bruno Desthuilliers
2007-09-27 19:48:33 UTC
Permalink
Pascale a écrit :
(snip)
Gloups... un langage typé, ça veut dire quoi ?
Les experts ne sont pas encore parvenus à une définition définitive et
univoque à ce jour. Mais tout le monde ou presque s'accorde à considérer
qu'un langage qui considère que '1' == 1 n'a pas vraiment un typage fort
!-)
Pascale
2007-10-03 12:14:40 UTC
Permalink
Post by Bruno Desthuilliers
Les experts ne sont pas encore parvenus à une définition définitive et
univoque à ce jour. Mais tout le monde ou presque s'accorde à considérer
qu'un langage qui considère que '1' == 1 n'a pas vraiment un typage fort
!-)
Arf© (o;
--
Pascale
Olivier Masson
2007-09-26 16:19:10 UTC
Permalink
Post by John GALLET
C'est à double tranchant, car il y a en a tellement qu'on s'y perd. Y
compris des trucs inutilement compliqués comme par exemple array_walk(),
qui permet de passer 5 bonnes minutes à se gratter le neurone devant le
man en ne comprenant strictement rien à ce qu'on lit alors qu'un bête
foreach() fait aussi bien le boulot.
C'est même plus pernicieux que ça car qd je trouve une fonction qui
ressemble à une autre, je me demande si je ne fais pas une grosse erreur
(de compréhension ou d'optimisation) en utilisant celle que je connais.
Pascale
2007-10-03 12:14:40 UTC
Permalink
Post by Olivier Masson
C'est même plus pernicieux que ça car qd je trouve une fonction qui
ressemble à une autre, je me demande si je ne fais pas une grosse erreur
(de compréhension ou d'optimisation) en utilisant celle que je connais.
Aaaaaah... je me sens moins seule ! (-:
--
Pascale
Olivier Miakinen
2007-09-24 15:46:07 UTC
Permalink
Post by Pascale
Désolée si la question est niveau neuneu, mais je trouve pas la réponse. Je
cherche simplement à savoir si une valeur se trouve parmi une liste.
if (($pays=='France') OR ($pays=='Allemagne') OR ($pays=='Italie) OR [...]
[...]
Je n'ai pas trouvé de réponse dans le manuel PHP... Y en a-t-il une ?
<http://fr2.php.net/switch>

Contrairement au C, en PHP on peut faire un switch sur des chaînes de
caractères.

switch ($pays) {
case 'France' :
case 'Allemagne' :
case 'Italie' :
$continent = 'Europe';
break;

case 'Niger' :
case 'Nigéria' :
$continent = 'Afrique';
break;

default :
echo "Ce pays n'est pas pris en compte";
$continent = null;
break;
}
Denis Beauregard
2007-09-24 17:49:57 UTC
Permalink
Post by Pascale
Bonjour à tous,
Désolée si la question est niveau neuneu, mais je trouve pas la réponse. Je
cherche simplement à savoir si une valeur se trouve parmi une liste.
if (($pays=='France') OR ($pays=='Allemagne') OR ($pays=='Italie) OR [...]
...
Mais y a-t-il moyen d'abréger un peu (j'ai toute une liste de pays) ? J'ai
if ($pays==('France' OR 'Allemagne' OR 'Italie'))
mais comme je m'y attendais, ça ne marche pas.
Je n'ai pas trouvé de réponse dans le manuel PHP... Y en a-t-il une ?
En plus du in_array proposé, il y a aussi les strstr et stristr
http://ca.php.net/manual/fr/function.strstr.php

if (!stristr(';France;Allemagne;Italie;',$i))

Un avantage, c'est de trouver un mot incomplet. Par exemple, cela
trouverait allemagn. C'est aussi un inconvénient pour la même raison.
Pour ce qui est de la vitesse, je pense que la différence est trop
petite pour qu'on en tienne compte. Par contre, si la liste est très
longue, le in_array serait préférable.

À vous de voir.


Denis
Olivier Miakinen
2007-09-24 18:34:02 UTC
Permalink
Post by Denis Beauregard
En plus du in_array proposé, il y a aussi les strstr et stristr
http://ca.php.net/manual/fr/function.strstr.php
if (!stristr(';France;Allemagne;Italie;',$i))
Pour que le test soit fait dans le même sens que celui qu'utilisait
Pascale, il ne faut pas le « ! » du début.

Et pour prévenir le cas où cette technique serait réutilisée avec des
chaînes pouvant commencer par "0", je ferais même :
if (stristr(';France;Allemagne;Italie;', $i) !== FALSE)
Post by Denis Beauregard
Un avantage, c'est de trouver un mot incomplet. Par exemple, cela
trouverait allemagn. C'est aussi un inconvénient pour la même raison.
Oui. Par exemple si on veut chercher "Niger" dans une liste qui contient
"Nigeria" sans accent. Cela dit, on peut adapter la technique comme ceci
pour ne trouver que les mots complets :

if (stristr(';France;Allemagne;Italie;', ";$i;") !== FALSE)

L'inconvénient principal de cette méthode, à mon humble avis, est que le
code en devient de moins en moins lisible. Personnellement, le switch
aurait ma préférence.
Pascale
2007-09-25 07:40:04 UTC
Permalink
Post by Denis Beauregard
En plus du in_array proposé, il y a aussi les strstr et stristr
http://ca.php.net/manual/fr/function.strstr.php
if (!stristr(';France;Allemagne;Italie;',$i))
Un avantage, c'est de trouver un mot incomplet. Par exemple, cela
trouverait allemagn. C'est aussi un inconvénient pour la même raison.
Pour ce qui est de la vitesse, je pense que la différence est trop
petite pour qu'on en tienne compte. Par contre, si la liste est très
longue, le in_array serait préférable.
À vous de voir.
J'avais pensé à un truc un peu dans ce genre : concaténer mes noms de pays
pour en faire un seul champ et rechercher ensuite si je retrouver ma chaîne
de caractères à l'intérieur. Mais j'ai eu peur de problèmes tels que ceux
que tu décris, même si ma liste de pays actuelle ne présente pas
d'ambiguïté.
--
Pascale
Denis Beauregard
2007-09-26 20:55:33 UTC
Permalink
Post by Pascale
Post by Denis Beauregard
En plus du in_array proposé, il y a aussi les strstr et stristr
http://ca.php.net/manual/fr/function.strstr.php
if (!stristr(';France;Allemagne;Italie;',$i))
Un avantage, c'est de trouver un mot incomplet. Par exemple, cela
trouverait allemagn. C'est aussi un inconvénient pour la même raison.
Pour ce qui est de la vitesse, je pense que la différence est trop
petite pour qu'on en tienne compte. Par contre, si la liste est très
longue, le in_array serait préférable.
À vous de voir.
J'avais pensé à un truc un peu dans ce genre : concaténer mes noms de pays
pour en faire un seul champ et rechercher ensuite si je retrouver ma chaîne
de caractères à l'intérieur. Mais j'ai eu peur de problèmes tels que ceux
que tu décris, même si ma liste de pays actuelle ne présente pas
d'ambiguïté.
Mon utilisation prévue est sans doute différente de la tienne.
Ce que j'avais en tête, c'est pour une liste de liens dans une
base de données, chaque lien appartenant à plusieurs catégories.

Avec mon truc, je pourrais par exemple avoir sur une ligne

;arseneaux;arsenault;arsenaud;arseno;

et trouver le lien avec plusieurs mots clés différents. Et ici, c'est
sans importance que la chaine soit trouvée en partie.

Pour une application de filtrage à partir d'une liste d'endroits, cela
est à double tranchant. D'un côté, à partir de Saint-Denis, je
trouverais Saint-Denis-sur-Richelieu, Saint-Denis de la Réunion,
Saint-Denis-le-Vêtu, Saint-Denis-de-L'Houmée com Beurlay
(Saint-Denis), etc. Donc, pour un moteur de recherche, c'est
acceptable et même préférable. D'un autre côté, à partir de
Paul*Champagne, je trouverais aussi Saint-Paul, Champagne mais
aussi ;Saint-Paul;Saint-Martin;Champagne sur Mer;

C'est une question d'utilisation que l'on veut en faire.

Une application réelle contiendrait par exemple
;F01;F26;F38; Pour France, départements 01, 26 et 38.


Denis
Pascale
2007-10-03 12:14:40 UTC
Permalink
[couic]
Je couique mais je te remercie pour l'explication très claire.
--
Pascale
Continuer la lecture sur narkive:
Loading...