2010-03-27 3 views
13

J'ai obtenu ce tableau multiple nommé $files[], qui se compose de clés et des valeurs comme ci-dessous:est-ce possible si callback dans array_filter reçoit le paramètre?

[0] => Array 
(
    [name] => index1.php 
    [path] => http://localhost/php/gettingstarted/ 
    [number] => 1 
) 

[1] => Array 
(
    [name] => index10.php 
    [path] => http://localhost/php/gettingstarted/ 
    [number] => 2 
) 

[2] => Array 
(
    [name] => index11.php 
    [path] => http://localhost/php/gettingstarted/ 
    [number] => 3 
) 

J'utilise ce code pour créer un nouveau tableau constitué de touches « nom » seulement. Mais il n'a pas

array_filter($files, "is_inarr_key('name')"); 

function is_inarr_key($array, $key) 
{ 
    //TODO : remove every array except those who got the same $key 
} 

et je reçois cette erreur:

array_filter() [function.array-filter]: The second argument, 'is_inarr_key('name')', should be a valid callback in C:\xampp\htdocs\php\gettingstarted\index.php on line 15

Mes questions sont les suivantes:

  1. Est-il possible de rendre la fonction de rappel sur array_filter paramètre Receive?
  2. Quelle est la règle générale sur l'utilisation du rappel dans n'importe quelle fonction intégrée de PHP?

Répondre

42

Vous pouvez créer une fermeture sur PHP ≥5.3.

array_filter($files, function($array) use ($key) { 
    return is_inarr_key($array, $key); 
}); 

Si vous êtes coincé avec PHP 5.3 < ...

Vous pouvez faire $key une variable globale.

function is_inarr_with_global_key($array) { 
    global $key; 
    .... 
} 

Vous pouvez créer une classe

class KeyFilter { 
    function KeyFilter($key) { $this->key = $key; } 
    function is_inarr_key($array) { ... } 
} 
... 
array_filter($files, array(new KeyFilter('name'), 'is_inarr_key')); 

Vous pouvez créer 3 fonctions différentes

array_filter($files, 'is_inarr_name'); 
array_filter($files, 'is_inarr_path'); 
array_filter($files, 'is_inarr_number'); 

Vous pouvez écrire votre propre array_filter

function my_array_filter($files, $key) { 
    ... 
} 
+0

j'ai pas essayer. mais cette solution est brilyan. si je convertis mon travail de code avec la fermeture ou la classe, je serai capable de travailler avec plus de clefs ET de créer SEULEMENT une ction d'amusement: is_inarr_key() – justjoe

+3

+1, mais si c'était ma réponse je listerais la solution basée sur la fermeture d'abord et recommanderai au cours des alternatives. C'est la plus simple et la plus courte des possibilités de loin. –

1

Je suis pas au courant si vous pouvez fournir la fonction de rappel avec des paramètres, mais comme une suggestion, vous pouvez définir une fonction de rappel pour array_filter

array_filter($files, "is_inarr_key"); 

Et pour obtenir le name du tableau, boucle juste sur le $file[] et récupérer le name. Puis, ayant le name vous pouvez continuer votre logique.

HTH.

2

Vous pouvez utiliser le array_walk fonction:

$arr = array(
     array("name" => "Jack", "id" => 1), 
     array("name" => "Rose", "id" => 2), 
    ); 

$result = array(); // initialize result array. 
array_walk($arr, "filter"); // iterate over the array calling filter fun for each value. 
// $result will now have elements "Jack" and "Rose" 

function filter($a) { 

    global $result; // to access the global result array. 

    $result[] = $a['name']; // for each array passed, save the value for the key 'name' in the result array. 
} 
1

Vous pouvez utiliser create_function() dans 5.2.x

$y = 5; 
$func = 'return $x > ' . $y . ';'; 
$f = create_function('$x', $func); 
$numbers = range(0, 10); 
$result = array_filter($numbers, $f); 
print_r($result); 

qui sort

Array ( [6] => 6 [7] => 7 [8] => 8 [9] => 9 [10] => 10 )

1

grâce KennyTM pour keyfilter class great tip. Pour ceux qui se soucient et ne savent pas comment le faire, c'est un exemple détaillé de travail. J'ai légèrement amélioré en utilisant un motif regexp.

$ fichiers [] = {code ci-dessus};

class KeyFilter { 
    function KeyFilter($attr,$pattern) 
    { 
     $this->attr=$attr; 
     $this->pattern=$pattern; 
    } 
    function is_inarr_key($t) 
    { 
     return preg_match($this->pattern,$t[$this->attr]);; 
    } 
} 


$t=array_filter($items, array(new KeyFilter("path","~\d{2}\.php~i"), 'is_inarr_key')); 
print_r($t); 
print_r($o->key); 

sortie:

[1] => Array 
(
    [name] => index**10**.php 
    [path] => http://localhost/php/gettingstarted/ 
    [number] => 2 
) 

[2] => Array 
(
    [name] => index**11**.php 
    [path] => http://localhost/php/gettingstarted/ 
    [number] => 3 
)