QA@IT

phpのarray_filterに引数を追加したい

8814 PV
function filter($var) {                                         
    return ($var >= 5);                                       
}
$array = [1,2,3,4,5,6,7,8,9];                                   
print_r(array_filter($array, 'filter'));                        

のfilterを

function filter($var, $limit) {                                         
    return ($var >= $limit);                                       
}

として、配列を絞る条件を変えたいのですが
array_filterではできないと思います

callback関数などを用いて上記のような処理はできないでしょうか

追記

ngyukiさんのがfunctionでまとまってていいですが、
他の書き方考えてみました

パターン1

$limit = 5;
$callback = function ($var) use ($limit) {
    return ($var > $limit);
};
print_r(array_filter($array, $callback));

パターン2

$func = function ($limit) {
    return function ($var) use ($limit) {
        return ($var > $limit);
    };  
};
$limit = 5;
print_r(array_filter($array, $func($limit)));

どれを選ぶかプロジェクト次第ですかね、と思ってます
せっかくarray_filterで短くかけるので、短いのがいいかと思ってます
(絞る処理を自前で書くのにくらべて)

回答

クロージャーが使えるなら部分適用でどうでしょうか?

<?php
function bindLast($func, $arg)
{
    return function () use ($func, $arg) {
        $args = func_get_args();
        $args[] = $arg;
        return call_user_func_array($func, $args);
    };
}

function filter($var, $limit) {
    return ($var >= $limit);
}

$array = [1,2,3,4,5,6,7,8,9];
print_r(array_filter($array, bindLast('filter', 3)));
print_r(array_filter($array, bindLast('filter', 7)));

bindLast は第一引数で指定された関数の最後の引数を、第二引数で指定された値で固定したクロージャーを返します。

要するに、

bindLast('filter', 7);

は、

function filter($var) {
    return ($var >= 7);
}

という関数のようなものを返します。

編集 履歴 (0)
  • やりたいことができてます、ありがとうございます。
    コード量が増えてしまいますね。
    もうちょっと、すっきりできないか考えてみます。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。