Page 1 sur 1

Array_map ... Grande découverte

Posté : 06 mai 2013, 11:41
par Webylog
Bonjour à tous ...

Progressant chaque jour dans le Php je découvre des choses et particulièrement cette fonction : array_map qui permet d'exécuter récursivement sur un tableau une fonction fournie en entrée ...

J'ai donc commencé avec des utilisations plutôt classique ... passer un tableau complet en majuscules etc ...

Dernièrement j'ai rajouter des recherche regexp mais là je commence à bloquer sur le problème suivant :

Une des façon de poser cette fonction est je suppose :
array_map(function($value) {
     echo $value;
} , $un_tableau);
La où je commence à galérer serait plutôt sur la possibilité de passer plusieurs paramètres à la fonction. J'ai lu la définition de array_map sur Php.net qui nous explique qu'il est possible de travailler avec plusieurs tableaux du genre :
function show_Spanish($n, $m)
{
    return("Le nombre $n se dit $m en Espagnol");
}

function map_Spanish($n, $m)
{
    return(array($n => $m));
}

$a = array(1, 2, 3, 4, 5);
$b = array("uno", "dos", "tres", "cuatro", "cinco");

$c = array_map("show_Spanish", $a, $b);
print_r($c);

$d = array_map("map_Spanish", $a , $b);
print_r($d);
Voulant toujours faire plus raccourci ... d'ailleurs je sais pas si c'est un bon reflexe ... j'essaye d'adapter cela à mon exemple suivant :

Lecture d'un repertoire avec la fonction glob() sur le masque suivant :glob("produits/produit_*.htm")

Ce qui m'interesse maintenant c'est la valeur du ' * ' que j'aimerais classer dans une valeur min et une valeur max afin d'avoir le premier numéro ainsi que le dernier ...

Et là ca bloque ... voici le code ...
$pointeur=opendir('./produits');
$tableau = glob("produits/produit_*.htm");
$nombre = count($tableau);
$res = array();
$minmax = array( 'min' => 0 , 'max' => 0);


array_map(function($value) { 
				preg_match('![0-9]+!' , $value , $extract);  
				$minmax['min'] = ( $extract[0] < $minmax['min'] ) ? $extract[0] : $minmax['min'];
				$minmax['max'] = ( $extract[0] > $minmax['max'] ) ? $extract[0] : $minmax['max'];
			} , $tableau , $minmax);
					
L'erreur générée est la suivante :
Notice: Undefined variable: minmax in C:\wamp\www\
M'y suis-je mal pris ??? Qu'est ce qui ne peux ne pas convenir suivant vos avis ?

Merci d'avance pour vos réponses ....

Re: Array_map ... Grande découverte

Posté : 06 mai 2013, 15:02
par Yosh
regarde du côté des closures (ou fonctions anonymes en fr) et tu trouveras ton bonheur.

Et juste pour que ce soit plus lisible (l'exemple est simplifier):
<?php
$tableau = array();
for($i=1;$i<50;++$i) {
    $tableau[] = "produit_$i.htm";
}

$minmax = array(
    'min' => 0, 
    'max' => 0
);

$callback = function ($value) use (&$minmax) {
    preg_match('![0-9]+!' , $value , $extract);
    if($extract[0] < $minmax['min']) {
        $minmax['min'] = $extract[0];
    }
    if($extract[0] > $minmax['max']) {
        $minmax['max'] = $extract[0];
    }
};

$result = array_map($callback, $tableau);

var_dump($minmax);

Re: Array_map ... Grande découverte

Posté : 06 mai 2013, 15:23
par Webylog
Merci pour ta réponse ...

Si je comprends le fonctionnement le fait d'utiliser ' & ' sur la var permet de créer une sorte de pointeur qui te permet donc de modifier à la volée la valeur de celle ci ...

Je t avoue j ai pas encore regardé pour les closures ... ce que je vais faire tres vite :D en tout cas merci =D>

Et bien là ... je te dis merci ... Nickel et en plus je me suis rendu que j'étais pas très loin du résultat final ... persévérance ... lol