fonction callback dans array_filter

Eléphanteau du PHP | 13 Messages

17 sept. 2007, 16:19

Bonjour,

Je souhaite extraire d'un tableau uniquement les lignes contenant une certaine chaine de caractères.

Je voudrais utiliser la fonction array_filter.
La fonction de callback que je voulais utiliser a donc 2 paramètres :
- un destiné à recevoir chaque valeur du tableau: $chaineTestee,
- un autre contenant la chaine recherchée: $chaineRecherchee.
function chaine_recherche($chaineTestee,$chaineRecherchee)
{
	return stristr ( $chaineTestee, $chaineRecherchee )
}
La syntaxe
print_r(array_filter($array1, "chaine_recherche"));
qui ne comporte que le nom de la fonction, ne me permet pas de définir la paramère de la chaine recherchée, c'est à dire $chaineRecherchee.

Comment utiliser cette fonction avec 2 paramètres ?
Si vis pacem para bellum

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

19 sept. 2007, 23:12

La fonction utilisateur utilisée par callback dans array_filter() ne doit comporter qu'un seul paramètre dans sa signature et ce paramètre correspond à chaque valeur dans le tableau filtré. C'est logique car ce paramètre passe implicitement au callback.

Maintenant pour passer plusieurs paramètres externes nécéssaire à l'algorithme de la fonction callback, il faut utiliser des variables globales. Ainsi, la fonction peut voir les valeurs externes nécéssaires.
Pour ça, on utilise le modificateur global dans la fonction pour déclarer les variables globales à accèder.

Exemple:
//Fonction callback
function chaine_recherche($chaineTestee)
{
    global $chaineRecherchee;
    return stristr ( $chaineTestee, $chaineRecherchee );
}

//Programme principal
$array1 = array ("aline", "toto", "ncolas", "toto123"); //source
$chaineRecherchee  = "toto"; //variable globale à la fonction callback
print_r(array_filter($array1, "chaine_recherche")); //recherche
ps: les variables globales de PHP ne sont globales que pour les fonctions qui le veulent. Il suffit que la fonction appelle les variables globales nécéssaires par le modificateur "global"
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

20 sept. 2007, 10:08

Je trouve cette solution plus élégante que celle que j'ai trouvée :
array_walk ($listeDesCours, 'recherche',$isin);
var_dump(array_filter($listeDesCours));
Merci !

Eléphanteau du PHP | 13 Messages

20 sept. 2007, 10:15

PS: je ne sais pas passer ce fil à "résolu".
Si vis pacem para bellum

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 sept. 2007, 10:18

Pour toutes ces question, il y a un joli sujet dans la FAQ : Comment mettre en forme vos messages
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer