Возможно ли, если обратный вызов в параметре 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
Итак, мои вопросы:
- Возможно ли сделать функцию обратного вызова на параметре приема
array_filter
?
- Каково общее правило о том, как использовать обратный вызов в любой встроенной функции PHP?
Ответы
Ответ 1
Вы можете создать закрытие на 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) {
...
}
Ответ 2
Вы можете использовать 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.
}
Ответ 3
Я не знаю, можете ли вы предоставить функцию обратного вызова с параметрами, но в качестве предложения вы можете определить функцию обратного вызова для array_filter
array_filter($files, "is_inarr_key");
И чтобы получить name
массива, просто зациклируйте на $file[]
и извлеките name.
Затем, имея name
, вы можете продолжить свою логику.
НТН.
Ответ 4
Вы можете использовать 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 )
Ответ 5
благодарит KennyTM за класс ключа keyfilter.
Для тех, кто заботится и не знает, как это сделать, этот рабочий подробный пример.
Я немного улучшил использование шаблона регулярного выражения.
$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
)