我想使用array_filter删除数组中的项,这些项的值等于'。'等特定字符。 。要做,所以我使用以下代码,但我不知道如何将回调函数传递给array_filter:
class Myclass(){
private function isPunc($var){
if($var=='.'){
return TRUE;
}else{
return FALSE;
}
public function myfunction($arr){
$arr = array_filter($arr,"isPunc");
}
}
知道如何解决这个问题吗?
答案 0 :(得分:2)
使用$arr = array_filter($arr, array($this, 'isPunc'));
答案 1 :(得分:2)
class Myclass(){
private function isPunc($var) {
if ($var=='.') {
return TRUE;
} else {
return FALSE;
}
}
public function myfunction($arr) {
$arr = array_filter($arr, array($this,'isPunc'));
}
}
答案 2 :(得分:0)
array_filter()需要一个Callable。这是PHP中的一种特殊内部类型,可以包含四个部分:
在您的情况下,第二个变体应该有效:
class FilterIsDot {
private function accept($element) {
if($element == '.'){
return TRUE;
}else{
return FALSE;
}
}
public function filter($array) {
return array_filter(
$array, array($this, 'accept')
);
}
}
$in = array('.', 'foo');
$filter = new FilterIsDot();
var_dump($filter->filter($in));
我建议采用不同的方法来避免使用array_filter()。 SPL包含FilterIterator类。你可以扩展这个类:
class FilterIsDot extends FilterIterator {
public function __construct($arrayOrIterator) {
parent::__construct(
is_array($arrayOrIterator)
? new ArrayIterator($arrayOrIterator)
: $arrayOrIterator
);
}
public function accept() {
if($this->current() == '.') {
return TRUE;
}else{
return FALSE;
}
}
}
$in = array('.', 'foo');
$filter = new FilterIsDot($in);
var_dump(iterator_to_array($filter));
在这种情况下,过滤器可以即时运行。它仅在实际访问元素时使用。