возможно ли, если обратный вызов в параметре array_filter принимает параметр?

Я получил этот множественный массив с именем $files[] , который состоит из ключей и значений, как показано ниже:

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

Я использую этот код для создания нового массива, состоящего только из «имени». Но это не удалось

 array_filter($files, "is_inarr_key('name')"); function is_inarr_key($array, $key) { //TODO : remove every array except those who got the same $key } 

и я получаю эту ошибку:

array_filter () [function.array-filter]: Второй аргумент 'is_inarr_key (' name ')' должен быть действительным обратным вызовом в C: \ xampp \ htdocs \ php \ getstarted \ index.php в строке 15

Поэтому мои вопросы:

  1. Возможно ли сделать функцию array_filter параметра приема array_filter ?
  2. Каково общее правило о том, как использовать обратный вызов в любой встроенной функции PHP?

Вы можете создать закрытие на PHP ≥5.3.

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

Если вы застряли с PHP <5.3, …

Вы можете сделать $key глобальной переменной.

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

Вы можете создать класс

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

Вы можете создать 3 различных функции

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

Вы можете написать свой собственный array_filter

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

Вы можете использовать функцию array_walk как:

 $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. } 

Я не знаю, можете ли вы предоставить функцию обратного вызова с параметрами, но в качестве предложения вы можете определить функцию обратного вызова для array_filter

 array_filter($files, "is_inarr_key"); 

И чтобы получить name массива, просто зациклитесь на $file[] и получите name. Затем, имея name вы можете продолжать свою логику.

НТН.

Вы можете использовать create_function () в 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); 

которые выходят

Массив ([6] => 6 [7] => 7 [8] => 8 [9] => 9 [10] => 10)

спасибо KennyTM за отличный ключ для клавишного фильтра . Для тех, кто заботится и не знает, как это сделать, этот рабочий подробный пример. Я немного улучшил использование шаблона регулярного выражения.

$ files [] = {код выше};

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

вывод:

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