Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3080 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  array_filter + transmission de variable dans une fonction callback

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

array_filter + transmission de variable dans une fonction callback

n°1385638
Hermes le ​Messager
Breton Quiétiste
Posté le 12-06-2006 à 10:59:01  profilanswer
 

Mon problème est simple :
 
Considérons cet exemple :
 

Code :
  1. $array_tbl = array(10,12,14,16,18,19,21);
  2. function test($input, $kikou)
  3. {
  4. if ($input < $kikou){ return TRUE; } else { return FALSE; }
  5. }
  6. print_r (array_filter ($array_tbl, "test" ));


 
Question : Comment faire dans le cadre d'un appel à une fonction callback pour transmettre une valeur de $kikou ?
 
J'ai regardé la doc de fond en comble, et aucun exemple. Est-ce au moins possible ?  :(

mood
Publicité
Posté le 12-06-2006 à 10:59:01  profilanswer
 

n°1385667
masklinn
í dag viðrar vel til loftárása
Posté le 12-06-2006 à 11:25:29  profilanswer
 

Dans d'autres langages tu utiliserait des closures, mais PHP n'ayant pas de notion de closures (ni de fonctions en tant que first-class objects, et toutes ses fonctions étant globales de toute façon) tu n'as --je pense -- d'autre choix que d'utiliser une variable globale que tu set avant chaque array_filter [:spamafote]
 
Ou alors si PHP peut créer des objets callables ou des conneries du même style (genre si tu peux callbacker sur une méthode) tu crées un objet de filtrage.
 
Edit: je viens de regarder, les objets PHP5 ont une magic method "__call", mais c'est équivalent à un method_missing: c'est le truc appelé pour overloader n'importe quelle méthode, et pas un moyen d'émuler la callabilité sur un objet [:bien]


Message édité par masklinn le 12-06-2006 à 11:47:00

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1385686
Hermes le ​Messager
Breton Quiétiste
Posté le 12-06-2006 à 11:46:10  profilanswer
 

Merci d'avoir prêter attention à la question déjà. :)
 
Ensuite, quand tu dis tu set une variable globale, tu veux dire quoi exactement ? global $kikou; dans la fonction ?
 
Parce que ça ne change rien. La variable doit quand même être déclarée avant la fonction quoi qu'il arrive. :(
 
Ah, je complête en disant que mon script doit être compatible PHP4.
 
En PHP5, ce serait différent.

Message cité 1 fois
Message édité par Hermes le Messager le 12-06-2006 à 11:47:05
n°1385689
Hermes le ​Messager
Breton Quiétiste
Posté le 12-06-2006 à 11:49:41  profilanswer
 

Code :
  1. $array_tbl = array(10,12,14,16,18,19,21);
  2. $kikou = 0;
  3. function test($input)
  4. {
  5. global $kikou
  6. if ($input < $kikou){ return TRUE; } else { return FALSE; }
  7. }
  8. $kikou = 10;
  9. print_r (array_filter ($array_tbl, "test" ));


 
$kikou n'est toujours pas transmis. :(
 
Il n'existe donc aucun moyen de transmettre une valeur différente de $kikou au cours de mon script. :(

n°1385700
masklinn
í dag viðrar vel til loftárása
Posté le 12-06-2006 à 12:02:25  profilanswer
 

Hermes le Messager a écrit :

Merci d'avoir prêter attention à la question déjà. :)
 
Ensuite, quand tu dis tu set une variable globale, tu veux dire quoi exactement ? global $kikou; dans la fonction ?
 
Parce que ça ne change rien. La variable doit quand même être déclarée avant la fonction quoi qu'il arrive. :(


Chez moi ça marche (enfin je fais tourner ça sur wamp, donc sur PHP5, global a été modifié entre php4 et php5?)

Code :
  1. <?php
  2.    $array_tbl = array(10,12,14,16,18,19,21);
  3.  
  4.    function test($input) {
  5.        global $trigger;
  6.        if ($input < $trigger){ return TRUE; } else { return FALSE; }
  7.    }
  8.  
  9.    $trigger = 17;
  10.    print_r (array_filter ($array_tbl, "test" ));
  11.    echo "<br>";
  12.    $trigger = 13;
  13.    print_r (array_filter ($array_tbl, "test" ));
  14.    echo "<br>";
  15.    $trigger = 25;
  16.    print_r (array_filter ($array_tbl, "test" ));
  17. ?>


Array ( [0] => 10 [1] => 12 [2] => 14 [3] => 16 )
Array ( [0] => 10 [1] => 12 )
Array ( [0] => 10 [1] => 12 [2] => 14 [3] => 16 [4] => 18 [5] => 19 [6] => 21 )


Hermes le Messager a écrit :

En PHP5, ce serait différent.


J'vois pas en quoi [:pingouino]

Message cité 1 fois
Message édité par masklinn le 12-06-2006 à 12:03:18

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1385701
zapan666
Tout est relatif
Posté le 12-06-2006 à 12:03:59  profilanswer
 

Code :
  1. function test($input)
  2.     {
  3.     if ($input < KIKOU){ return TRUE; } else { return FALSE; }
  4. }
  5. define('KIKOU', 10);
  6. print_r (array_filter ($array_tbl, "test" ));


 :o Je ne garanti rien sur la qualite de cette *chose*
 
(pas teste etc)


Message édité par zapan666 le 12-06-2006 à 12:04:49

---------------
my flick r - Just Tab it !
n°1385704
masklinn
í dag viðrar vel til loftárása
Posté le 12-06-2006 à 12:10:33  profilanswer
 

[controverse]L'autre solution ce serait d'utiliser un vrai langage :o[/controverse]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1385720
Hermes le ​Messager
Breton Quiétiste
Posté le 12-06-2006 à 12:24:49  profilanswer
 

masklinn a écrit :

Chez moi ça marche (enfin je fais tourner ça sur wamp, donc sur PHP5, global a été modifié entre php4 et php5?)

Code :
  1. <?php
  2.    $array_tbl = array(10,12,14,16,18,19,21);
  3.  
  4.    function test($input) {
  5.        global $trigger;
  6.        if ($input < $trigger){ return TRUE; } else { return FALSE; }
  7.    }
  8.  
  9.    $trigger = 17;
  10.    print_r (array_filter ($array_tbl, "test" ));
  11.    echo "<br>";
  12.    $trigger = 13;
  13.    print_r (array_filter ($array_tbl, "test" ));
  14.    echo "<br>";
  15.    $trigger = 25;
  16.    print_r (array_filter ($array_tbl, "test" ));
  17. ?>


Array ( [0] => 10 [1] => 12 [2] => 14 [3] => 16 )
Array ( [0] => 10 [1] => 12 )
Array ( [0] => 10 [1] => 12 [2] => 14 [3] => 16 [4] => 18 [5] => 19 [6] => 21 )




 
Ah vi, tiens, ton exemple marche. J'ai du merder quelque part.
 
Un grand merci à toi.
 
Je suis en train de faire une BDD entièrement en PHP sans SQL, XML ou quoi que ce soit d'autre (pour des applications modestes, ça va de soi), et les boucles de + de 10 000, enfin bref, tu vois quoi. :D
 
Pratique de pouvoir faire des tests sur un tableau entier. Par contre, reste à voir en terme de perf ce que ça donne. :/

n°1385732
masklinn
í dag viðrar vel til loftárása
Posté le 12-06-2006 à 12:56:36  profilanswer
 

Hermes le Messager a écrit :

Je suis en train de faire une BDD entièrement en PHP sans SQL, XML ou quoi que ce soit d'autre (pour des applications modestes, ça va de soi), et les boucles de + de 10 000, enfin bref, tu vois quoi. :D


Ben j'te souhaite bien du plaisir [:pingouino]

Spoiler :

pervers [:mlc]


 
edit: t'avais pas mis de ";" après ton "global $kikou", 10 contre 1 que ça vient de là mais que PHP est trop stupide pour te le dire :o
(genre il a décidé que finalement il allait pas définir la fonction, un truc du style)


Message édité par masklinn le 12-06-2006 à 12:58:13

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1385875
Hermes le ​Messager
Breton Quiétiste
Posté le 12-06-2006 à 16:09:52  profilanswer
 

Un grand merci à toi Masklinn, ça marche nikel. :jap:


Message édité par Hermes le Messager le 12-06-2006 à 16:10:08
mood
Publicité
Posté le 12-06-2006 à 16:09:52  profilanswer
 

n°2006083
weed
Posté le 30-06-2010 à 16:01:47  profilanswer
 

J'ai a peu près le meme soucis que Hermes à l'exception que j'aimerais bien :  
- 1./ transmettre une variable (un objet) dans la fonction callback  
- 2./ et exploiter sa valeur pour faire mes calculs dans la fonction callback
 
Comme cela a été suggéré, j'ai essayé de déclarer la variable $machine en global dans la fonction callback mais son contenu est vide dans la fonction callback.
 

Code :
  1. $tab = array (1, 4, 5, 10);
  2. //récupération d'un objet "machine"
  3. $machine = $machineObject->fetch($machineId);
  4. // on voit bien le contenu de l'objet à ce niveau la
  5. //print_r($machine );  
  6. function translate(&$value) {
  7.     global $machine;
  8.     //on ne voit plus le contenu de l'objet
  9. print_r($machine );
  10.     $value = $value *$machine->memory;
  11. }
  12. array_walk($tab, 'translate');


 
Comment dois je m'y prendre ?  
Je suis en PHP5 par contre

n°2006094
Paulp
~, sweet ~
Posté le 30-06-2010 à 16:16:46  profilanswer
 

Sinon, ça doit être possible avec create_function http://www.php.net/manual/fr/funct [...] nction.php

Code :
  1. function translate(&$value, $machine) {
  2.  $value = $value *$machine->memory;
  3. }
  4.  
  5.  '&$value',
  6.  'translate($value,'.$machine.');'
  7. ));


n°2006095
Paulp
~, sweet ~
Posté le 30-06-2010 à 16:18:16  profilanswer
 
n°2006111
weed
Posté le 30-06-2010 à 16:42:30  profilanswer
 


Pfff  :pfff: , pourquoi n'ai je pas mieux regarder la doc de la fonction :(
 
Merci beaucoup Paulp pour ta réactivité. Cela fonctionne nickel.
 
 

Paulp a écrit :

Sinon, ça doit être possible avec create_function http://www.php.net/manual/fr/funct [...] nction.php

Code :
  1. function translate(&$value, $machine) {
  2.  $value = $value *$machine->memory;
  3. }
  4.  
  5.  '&$value',
  6.  'translate($value,'.$machine.');'
  7. ));




Ahh oui, très bonne piste par contre j'ai une erreur comme quoi l'objet ne peut pas être converti en String.  
Je ne suis pas étonné. J'étais surpris de ton code '.$machine.' pour passer l'objet à la fonction.  
 
A ma connaissance, je pense qu'il existe 2 moyens :  
- passer en paramètre l'objet machine sérialiser  
- ou en plus propre, passer l'adresse de l'objet machine. (ca par contre je ne sais pas faire  :ange: )
 
 
 

n°2006114
Paulp
~, sweet ~
Posté le 30-06-2010 à 16:47:48  profilanswer
 

oui, ou bien utiliser $machine->memory qui est, a priori, une valeur numerique donc convertissable en string directement

Code :
  1. function translate(&$value, $memory) {
  2.  $value = $value *$memory;
  3. }
  4.  
  5.  '&$value',
  6.  'translate($value,'.$machine->memory.');'
  7. ));


Message édité par Paulp le 30-06-2010 à 16:48:53
n°2006154
weed
Posté le 30-06-2010 à 22:00:03  profilanswer
 

oui tu as raison, cela peut etre une solution. Je vais tester cela au taff ta 2ème solution par curiosité.

n°2007322
Dj YeLL
$question = $to_be || !$to_be;
Posté le 06-07-2010 à 10:35:29  profilanswer
 

Hermes le Messager a écrit :

Mon problème est simple :

 

Considérons cet exemple :

 
Code :
  1. $array_tbl = array(10,12,14,16,18,19,21);
  2. function test($input, $kikou)
  3. {
  4. if ($input < $kikou){ return TRUE; } else { return FALSE; }
  5. }
  6. print_r (array_filter ($array_tbl, "test" ));
 

Question : Comment faire dans le cadre d'un appel à une fonction callback pour transmettre une valeur de $kikou ?

 

J'ai regardé la doc de fond en comble, et aucun exemple. Est-ce au moins possible ?  :(

 
Code :
  1. $func = create_function('$input', 'return $input < ' . $kikou . ';');
  2. print_r(array_filter($array_tbl, $func));
 

Edit : erf, je viens seulement de voir la date du 1er message -__- (m'enfin, ça pourra peut être servir à d'autres)


Message édité par Dj YeLL le 06-07-2010 à 10:36:12

---------------
Gamertag: CoteBlack YeLL

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  array_filter + transmission de variable dans une fonction callback

 

Sujets relatifs
Mysql -> Fonction IN (1,2,3) AND et pas ORPb variable bool
fonction Lookup plante GDB sous DDD[JavaScript] Récupérer une variable serveur
fonction somme avec des variablesFonction JS dans formulaire html
[Résolu] Générer une variableFonction mail avec un if else tout bête et javascript confirm()
variable php sqlFichier .txt => Tableau Array() ?
Plus de sujets relatifs à : array_filter + transmission de variable dans une fonction callback


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR