我得到了一个名为$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
)
我使用此代码创建一个仅包含'name'键的新数组。但它失败了
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')'应该是第15行的C:\ xampp \ htdocs \ php \ gettingstarted \ index.php中的有效回调
所以我的问题是:
array_filter
接收参数?答案 0 :(得分:42)
你可以在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) {
...
}
答案 1 :(得分: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.
}
答案 2 :(得分:1)
我不知道你是否可以提供带参数的回调函数,但作为建议,你可以为array_filter
定义一个回调函数
array_filter($files, "is_inarr_key");
要获取数组的name
,只需遍历$file[]
并检索name.
然后,拥有name
即可继续使用逻辑。
HTH。
答案 3 :(得分:1)
您可以在5.2.x中使用create_function()
$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 )
答案 4 :(得分:1)
感谢KennyTM keyfilter class great tip。 对于那些关心并且不知道如何做的人来说,这是一个有效的详细例子。 我使用正则表达式模式略有改进。
$ files [] = {code above};
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
)