2013-04-13 1 views
0

Imaginez (même si ce n'est pas un bon style) vous avez un tableau dans lequel vous ajoutez Tableaux avec un peu de contenu.
Peut-être quelque chose comme ceci:Fonction anonyme dans php

$result_array = array(); 

foreach(... as $key => $value) { 
    $temp = array(); 
    $temp["start"] = $value->start; 
    $temp["end"] = $value->end; 
    $result_array[] = $temp; 
} 

// Image it will produce for example an $result_array like this: 
    array(
     array("start" => 10, "end" => 20), 
     array("start" => 100, "end" => 120) 
    ); 

Jusqu'à présent, si bon. Maintenant, faisons quelques choses sales comme ceci: Je veux ajouter une fonction anonyme qui renvoie l'intervalle entre commencer et fin dans chaque temp_array. Cela pourrait ressembler à ceci:

foreach(... as $key => $value) { 
    $temp = array(); 
    $temp["start"] = $value->start; 
    $temp["end"] = $value->end; 
    $temp["duration"] = function() { return abs(__START__ - __END__); } 
    $result_array[] = $temp; 
} 

Comme je suis dans un « Array » et je ne sais pas mon index, comment puis-je accéder à mon début et de fin?

Veuillez ne pas me flamber pour des erreurs de style ou de syntaxe, c'est juste un exemple que j'ai noté dans le champ de la question.

Merci d'avance.

Répondre

1

Une fonction anonyme n'a aucune connexion avec son "tableau de contexte". Vous ne pouvez pas obtenir les valeurs du tableau dans lequel se trouve la fonction car il n'y a pas de connexion inhérente entre la fonction et le tableau. Le mieux que vous pouvez faire est de donner les valeurs par une fermeture lors de la création:

$temp['duration'] = function() use ($value) { return abs($value->start - $value->end); } 

Cela ne fonctionne pas dans une boucle bien sûr, puisque la valeur des $value changements, vous avez donc besoin d'une fonction de production fonction de briser cette référence:

$temp['duration'] = call_user_func(function ($v) { 
    return function() use ($v) { return abs($v->start - $v->end); }; 
}, $value); 

Je ne sais pas pourquoi vous iriez à travers tout ce mal si au lieu de simplement calculer et insérer la valeur dans le tableau en tant que normale.

1

Je ne sais vraiment pas si pour une raison quelconque (inconnu pour moi) c'est une mauvaise pratique, mais vous pouvez utiliser des références comme ceci:

$temp["start"] = $value->start; 
$start = &$temp["start"]; 
$temp["end"] = $value->end; 
$end = &$temp["end"]; 
$temp["duration"] = function() use (&$start, &$end) { return abs($start - $end); }; 

D'ailleurs, est-il une raison que vous voulez faire une opération "paresseuse" sur ces valeurs?

+0

opération paresseuse? –

+0

Désolé, je voulais juste dire pourquoi vous ne pouvez pas simplement calculer la valeur pendant que vous êtes en boucle au lieu d'utiliser une fonction anonyme. Est-ce que ces valeurs changent après cette boucle? – Uby

Questions connexes