带有回调参数的PHP数组_过滤器

带有回调参数的PHP数组_过滤器,php,arrays,filtering,Php,Arrays,Filtering,我需要在PHP中过滤数组,但不确定如何将参数传递给回调。基本上,我要对数组中的每个项进行两次比较 // This data will be sent to the function as JSON so I'm "creating" the JSON here. $data = json_encode(Array( Array("StartDate"=>"2014/07/31","LocZipCode"=>"19406","LocationURL"=>"FSU","Ev

我需要在PHP中过滤数组,但不确定如何将参数传递给回调。基本上,我要对数组中的每个项进行两次比较

// This data will be sent to the function as JSON so I'm "creating" the JSON here.
$data = json_encode(Array(
    Array("StartDate"=>"2014/07/31","LocZipCode"=>"19406","LocationURL"=>"FSU","EventType"=>"UN"),
    Array("StartDate"=>"2014/08/31","LocZipCode"=>"23513","LocationURL"=>"FSU","EventType"=>"UN"),
    Array("StartDate"=>"2014/07/31","LocZipCode"=>"92108","LocationURL"=>"BU","EventType"=>"UN"),
    Array("StartDate"=>"2014/09/30","LocZipCode"=>"78661","LocationURL"=>"BU","EventType"=>"UN")
));

// even using a global variable doesn't 
// make it visible in getUniv() function
global $univ_seg;
$univ_seg = 'FSU';

getUA($data, $univ_seg);

function getUniv($var){
    return($var["EventType"] == "UN" && $var["LocationURL"] == $univ_seg);
}

function getUA($data, $univ_seg) {
    $univ_sched = json_decode($data, true);
    $re = array_filter($univ_sched, "getUniv");
    print_r($re); 
}

我也尝试过使用lambda,但我就是做不到。有什么想法吗???

为什么不试试匿名函数呢?我发现回调在这种情况下效果更好

function getUA($data, $univ_seg) {
    $univ_sched = json_decode($data, true);
    $re = array_filter($univ_sched, function($var){
        return($var["EventType"] == "UN" && $var["LocationURL"] == 'FSU');
    });
    print_r($re); 
}

为什么不试试匿名函数呢?我发现回调在这种情况下效果更好

function getUA($data, $univ_seg) {
    $univ_sched = json_decode($data, true);
    $re = array_filter($univ_sched, function($var){
        return($var["EventType"] == "UN" && $var["LocationURL"] == 'FSU');
    });
    print_r($re); 
}
全局变量不是这样工作的——要访问全局变量,您需要在每个要使用它的作用域中进行匹配的
global
声明

function getUniv($var){
    global $univ_seg;
    return($var["EventType"] == "UN" && $var["LocationURL"] == $univ_seg);
}
不过,作为匿名函数,这会更好:

$re = array_filter($univ_sched, function getUniv($var) use ($univ_seg) {
    return($var["EventType"] == "UN" && $var["LocationURL"] == $univ_seg);
});
全局变量不是这样工作的——要访问全局变量,您需要在每个要使用它的作用域中进行匹配的
global
声明

function getUniv($var){
    global $univ_seg;
    return($var["EventType"] == "UN" && $var["LocationURL"] == $univ_seg);
}
不过,作为匿名函数,这会更好:

$re = array_filter($univ_sched, function getUniv($var) use ($univ_seg) {
    return($var["EventType"] == "UN" && $var["LocationURL"] == $univ_seg);
});

我用一个物体让它工作


我用一个物体让它工作


您可以使用lambda函数:

$data = json_encode(Array(
    Array("StartDate"=>"2014/07/31","LocZipCode"=>"19406","LocationURL"=>"FSU","EventType"=>"UN"),
    Array("StartDate"=>"2014/08/31","LocZipCode"=>"23513","LocationURL"=>"FSU","EventType"=>"UN"),
    Array("StartDate"=>"2014/07/31","LocZipCode"=>"92108","LocationURL"=>"BU","EventType"=>"UN"),
    Array("StartDate"=>"2014/09/30","LocZipCode"=>"78661","LocationURL"=>"BU","EventType"=>"UN")
));

$univ_seg = 'FSU';

getUA($data, $univ_seg);

function getUnivFunc($univ_seg){
    return create_function('$a','return $a["EventType"] == "UN" && $a["LocationURL"] == "' . $univ_seg . '";');
}

function getUA($data, $univ_seg) {
    $univ_sched = json_decode($data, true);
    $re = array_filter($univ_sched, getUnivFunc($univ_seg));
    print_r($re); 
}

给出:

Array
(
    [0] => Array
        (
            [StartDate] => 2014/07/31
            [LocZipCode] => 19406
            [LocationURL] => FSU
            [EventType] => UN
        )

    [1] => Array
        (
            [StartDate] => 2014/08/31
            [LocZipCode] => 23513
            [LocationURL] => FSU
            [EventType] => UN
        )

)

您可以使用lambda函数:

$data = json_encode(Array(
    Array("StartDate"=>"2014/07/31","LocZipCode"=>"19406","LocationURL"=>"FSU","EventType"=>"UN"),
    Array("StartDate"=>"2014/08/31","LocZipCode"=>"23513","LocationURL"=>"FSU","EventType"=>"UN"),
    Array("StartDate"=>"2014/07/31","LocZipCode"=>"92108","LocationURL"=>"BU","EventType"=>"UN"),
    Array("StartDate"=>"2014/09/30","LocZipCode"=>"78661","LocationURL"=>"BU","EventType"=>"UN")
));

$univ_seg = 'FSU';

getUA($data, $univ_seg);

function getUnivFunc($univ_seg){
    return create_function('$a','return $a["EventType"] == "UN" && $a["LocationURL"] == "' . $univ_seg . '";');
}

function getUA($data, $univ_seg) {
    $univ_sched = json_decode($data, true);
    $re = array_filter($univ_sched, getUnivFunc($univ_seg));
    print_r($re); 
}

给出:

Array
(
    [0] => Array
        (
            [StartDate] => 2014/07/31
            [LocZipCode] => 19406
            [LocationURL] => FSU
            [EventType] => UN
        )

    [1] => Array
        (
            [StartDate] => 2014/08/31
            [LocZipCode] => 23513
            [LocationURL] => FSU
            [EventType] => UN
        )

)

如果要使该变量成为
getUniv()
函数的全局变量,请将全局语句放在函数内。如果要使该变量成为
getUniv()
函数的全局变量,请将全局语句放在函数内。您需要
use
like…
函数($var)use($univ\u seg){
如果要在多个位置调用它,使用函数是有意义的。@Yoshi不是这种情况。@JaredFarrish虽然这是真的,但它也不常见,OP只显示作为回调使用的函数。如果没有
使用
$univ_seg
将在
数组的回调中未定义_过滤器
。当前您将收到一个
通知:未定义变量:univ_seg
警告。您需要
使用
函数($var)使用($univ_seg){
如果要在多个位置调用它,使用函数是有意义的。@Yoshi不是这种情况。@JaredFarrish虽然这是真的,但它也不常见,OP只显示作为回调使用的函数。如果没有
使用
$univ_seg
将在
数组的回调中未定义_过滤器
。当前您将收到一条
通知:未定义变量:univ_seg
警告。如果需要传递两个参数,该怎么办如果需要传递两个参数呢