array_filter + transmission de variable dans une fonction callback

array_filter + transmission de variable dans une fonction callback - PHP - Programmation

Marsh Posté le 12-06-2006 à 10:59:01    

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 ?  :(

Reply

Marsh Posté le 12-06-2006 à 10:59:01   

Reply

Marsh Posté le 12-06-2006 à 11:25:29    

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
Reply

Marsh Posté le 12-06-2006 à 11:46:10    

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
Reply

Marsh Posté le 12-06-2006 à 11:49:41    

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. :(

Reply

Marsh Posté le 12-06-2006 à 12:02:25    

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
Reply

Marsh Posté le 12-06-2006 à 12:03:59    

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 !
Reply

Marsh Posté le 12-06-2006 à 12:10:33    

[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
Reply

Marsh Posté le 12-06-2006 à 12:24:49    

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. :/

Reply

Marsh Posté le 12-06-2006 à 12:56:36    

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
Reply

Marsh Posté le 12-06-2006 à 16:09:52    

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


Message édité par Hermes le Messager le 12-06-2006 à 16:10:08
Reply

Marsh Posté le 12-06-2006 à 16:09:52   

Reply

Marsh Posté le 30-06-2010 à 16:01:47    

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

Reply

Marsh Posté le 30-06-2010 à 16:16:46    

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. ));


Reply

Marsh Posté le 30-06-2010 à 16:18:16    

Reply

Marsh Posté le 30-06-2010 à 16:42:30    


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: )
 
 
 

Reply

Marsh Posté le 30-06-2010 à 16:47:48    

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
Reply

Marsh Posté le 30-06-2010 à 22:00:03    

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

Reply

Marsh Posté le 06-07-2010 à 10:35:29    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed