2010-03-27 4 views
13

Ich habe diese mehrere Array $files[] genannt, die als unterhalb von Schlüsseln und Werten besteht:ist es möglich, wenn Callback in array_filter Parameter empfangen?

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

ich diesen Code verwenden nur ein neues Array bestehen aus ‚name‘ Schlüssel zu erstellen. Aber es scheiterte

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

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

und ich bekomme diese Fehlermeldung:

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

Also meine Fragen sind:

  1. Ist es möglich, die Rückruffunktion auf array_filter erhalten Parameter zu machen?
  2. Was ist die allgemeine Faustregel zur Verwendung von Callback in einer PHP-integrierten Funktion?

Antwort

42

Sie können eine Schließung auf PHP ≥5.3 erstellen.

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

Wenn Sie mit PHP < 5.3, stecken ...

können Sie $key machen eine globale Variable.

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

können Sie eine Klasse erstellen

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

Sie 3 verschiedene Funktionen erstellen können

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

Sie können Ihre eigenen array_filter

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

ich versuche, habe es nicht. aber diese Lösung ist Brilyan. Wenn ich meine Code-Arbeit mit Schließung oder Klasse umwandeln, kann ich mit mehr Schlüsseln arbeiten UND NUR eine Funktion erstellen: is_inarr_key() – justjoe

+3

+1, aber wenn es meine Antwort wäre, würde ich die auf Verschluss basierende Lösung zuerst auflisten und empfehlen es über die Alternativen. Es ist die einfachste und kürzeste der Möglichkeiten bei weitem. –

1

Ich bin nicht bewusst, wenn Sie die Callback-Funktion mit Parametern liefern kann, sondern als Anregung, könnten Sie eine Callback-Funktion für array_filter

array_filter($files, "is_inarr_key"); 

definieren und die name des Arrays, nur Schleife zu erhalten über die $file[] und rufen Sie die name. Dann mit der name können Sie mit Ihrer Logik weitermachen.

HTH.

2

Sie können Gebrauch machen schreiben die array_walk Funktion als:

$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

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

die

gibt

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

1

dank KennyTM für keyfilter class great tip verwenden können. Für diejenigen, die sich interessieren und nicht wissen, wie es geht, ist dies ein funktionierendes detailliertes Beispiel. Ich verbesserte etwas mit einem Regexp-Muster.

$ files [] = {code oben};

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

Ausgang:

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