Нечто, приближающееся к реальной поддержке стилей функционального программирования в PHP, очень, очень новое - только в PHP 5.3 функции стали первоклассными и стали возможными анонимные функции.
Кстати, вы никогда не должны использовать create_function()
.Что он на самом деле делает, так это определяет новую функцию в глобальном пространстве имен (которая никогда никогда не будет собирать мусор!) И использует eval()
за кулисами.
Если у вас есть PHP5.3 или выше, вы можете сделать это:
$all_tags = array('A', 'B', 'C');
function is_not_equal($a, $b) {
return $a != $b;
}
function array_filter_tagname($alltags, $name) {
$isNotEqualName = function($item) use ($name){
return is_not_equal($item, $name);
};
// array_merge() is ONLY to rekey integer keys sequentially.
// array_filter() preserves keys.
return array_merge(array_filter($alltags, $isNotEqualName));
}
function make_url($arr) {
return 'input.php?'.http_build_query(array('x'=>$arr));
}
$res = array_filter_tagname($all_tags, 'B');
print_r($res);
print_r(make_url($res));
Если у вас PHP <5.3, вы должны использовать объект class + для замыканий вместо <code>create_function().
class NotEqualName {
protected $otheritem;
function __construct($otheritem) { // with PHP 4, use "function NotEqualName($otheritem) {"
$this->otheritem = $otheritem;
}
function compare($item) {
return $item != $this->otheritem;
}
}
function array_filter_tagname_objectcallback($alltags, $name) {
$isNotEqualName = new NotEqualName($name);
return array_merge(array_filter($alltags, array($isNotEqualName,'compare')));
}
В целом, однако, PHP не очень подходит для функционального стиля, и для вашей конкретной задачи использование array_filter()
не очень идиоматично.array_diff()
- лучший подход.