2010-03-27 9 views
13

Ho avuto questa serie multipla di nome $files[], che consiste di chiavi e valori come di seguito:è possibile se la richiamata nel parametro array_filter riceve?

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

io uso questo codice per creare un nuovo array composto da chiavi di 'nome' solo. Ma non è riuscito

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

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

ed ottengo questo errore:

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

Quindi le mie domande sono:

  1. E 'possibile effettuare la funzione di richiamata su array_filter ricevere parametro?
  2. Qual è la regola generale su come utilizzare la funzione di callback in una funzione integrata di PHP?

risposta

42

È possibile creare una chiusura su PHP ≥5.3.

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

Se sei bloccato con PHP < 5.3, ...

Si può fare $key una variabile globale.

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

È possibile creare una classe

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

È possibile creare 3 funzioni differenti

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

È possibile scrivere il proprio array_filter

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

non ho provarlo. ma questa soluzione è brilyan. se converto il mio codice a lavorare con chiusura o classe, potrò lavorare con più chiavi E creare SOLO una sola cosa divertente: is_inarr_key() – justjoe

+3

+1, ma se fosse la mia risposta elencherei prima la soluzione basata sulla chiusura e raccomanderei sopra le alternative. È di gran lunga la più semplice e la più breve delle possibilità. –

1

non sono a conoscenza se è possibile fornire la funzione di callback con i parametri, ma come un suggerimento, si potrebbe definire una funzione di callback per array_filter

array_filter($files, "is_inarr_key"); 

E per ottenere il name della matrice, basta ciclo sopra il $file[] e recuperare il name. Quindi, avendo il name si può andare avanti con la tua logica.

HTH.

2

È possibile fare uso di lo array_walk funzione:

$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

È possibile utilizzare create_function() in 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); 

che emette

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

1

grazie KennyTM per keyfilter class great tip. Per coloro che si preoccupano e non sanno come farlo, questo è un esempio dettagliato e funzionante. Ho leggermente migliorato usando uno schema regexp.

$ files [] = {codice sopra};

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

uscita:

[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 
) 
Problemi correlati