in_array multidimensionnel

Invité
Invité n'ayant pas de compte PHPfrance

03 juin 2008, 10:42

Bonjour,
J'ai le tableau suivant:
$tab[0] = array(1, 2, 3);
$tab[1] = array(3, 4, 5);
$tab[3] = array(6, 7, 8);
Est-il possible d'utiliser in_array pour savoir si une valeur se trouve dans l'un des sous tableaux?
Merci pour vos réponses.

Mammouth du PHP | 1353 Messages

03 juin 2008, 10:53

As tu essayé d'utiliser in_array() avec $tab[0] comme variable ?

Cela devrait fonctionner sans problème.

Il suffit de passer comme élément un tableau à in_array(), donc $tab[0],$tab[1]...

Ainsi avec une combinaison de foreach() sur $tab et de in_array() sur les valeurs du tableau tu devrais pouvoir chercher sans problème...
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Invité
Invité n'ayant pas de compte PHPfrance

03 juin 2008, 11:38

oui effectivement, ça marche bien. mais vu que in_array a un foreach "intégré" pour parcourir un tableau, je me demande si c'est possible de faire la même chose sur les sous tableaux: ne pas utiliser de foreach.

Eléphant du PHP | 224 Messages

03 juin 2008, 14:51

Bonjour :)

Voici quelques pistes... mais :shock:

1. Si on connaît d'avance les différentes sous-listes à tester :
$tab[0] = array(1, 2, 3); 
$tab[1] = array(3, 4, 5); 
$tab[3] = array(6, 7, 8);

$tst = 3;
echo (int)in_array($tst, array_merge($tab[0], $tab[1], $tab[3])); // 1

/* ----- */

$tst = 12;
echo (int)in_array($tst, array_merge($tab[0], $tab[1], $tab[3])); // 0

2. Sans connaître d'avance les différentes sous-listes et sans utiliser 'foreach' :
$tab[0] = array(1, 2, 3); 
$tab[1] = array(3, 4, 5); 
$tab[3] = array(6, 7, 8);

$tst = 3;
$res = 0;

function inArray($arr, $key) {
	global $tst, $res;
	if (in_array($tst, $arr)) { $res = 1; }
}
array_walk($tab, 'inArray');
echo $res; // 1

/* ----- */

$tst = 12;
echo $res; // 0

3. Sans connaître d'avance les différentes sous-listes et avec un 'foreach' :
$tab[0] = array(1, 2, 3); 
$tab[1] = array(3, 4, 5); 
$tab[3] = array(6, 7, 8);

$tst = 3;
$res = 0;

foreach ($tab as $key => $val) {
	if (in_array($tst, $val)) { $res = 1; }
}

echo $res; // 1

/* ----- */

$tst = 12;
echo $res; // 0
Ces codes peuvent bien-sûr être optimisés le cas échéant...

Je disais "mais" en préambule, en effet, parfois les solutions alternatives sont finalement moins intéressantes que la solution de base, en tout cas en ce qui concerne les pistes que je viens de proposer... à voir donc l'utilité selon l'utilisation... :shock: :D

à+ :)
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

ViPHP
AB
ViPHP | 5818 Messages

03 juin 2008, 18:17

oui effectivement, ça marche bien. mais vu que in_array a un foreach "intégré" pour parcourir un tableau, je me demande si c'est possible de faire la même chose sur les sous tableaux: ne pas utiliser de foreach.
Tel que tu le demande la réponse est non. On ne peut pas passer de praramètre à in_array() pour lui indiquer de chercher sur plusieurs niveaux. Comme l'indique la doc http://fr2.php.net/in_array in_array — Indique si une valeur appartient à un tableau (que cette valeur soit elle-même un tableau ou non)

Donc, comme mentionné dans les messages précédents, il faudra passer par une fonction qui liste ton tableau (foreach...) ou qui applique une fonction sur chacun des éléments de ton tableau.