【问题标题】:PHP array_filter with argument to callback [duplicate]带有回调参数的PHP array_filter [重复]
【发布时间】:2014-09-21 10:51:01
【问题描述】:

我需要在 PHP 中过滤一个数组,但不知道如何将参数传递给回调。本质上,我要对数组中的每个项目进行 2 次比较。

// 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,但我无法让它工作。有什么想法吗??

【问题讨论】:

  • 如果你想让这个变量对你的getUniv()函数是全局的,把全局语句放在函数里面。

标签: php arrays filtering


【解决方案1】:

您可以使用 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); 
}

http://codepad.org/LnVVry5L

给予:

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
        )

)

【讨论】:

    【解决方案2】:
    // even using a global variable doesn't 
    // make it visible in getUniv() function
    global $univ_seg;
    $univ_seg = 'FSU';
    

    这不是全局变量的工作方式 - 要访问全局变量,您需要在要使用它的每个作用域中都有一个匹配的 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);
    });
    

    【讨论】:

      【解决方案3】:

      我使用对象http://www.php.net/manual/en/language.pseudo-types.php#language.types.callback 使其工作

      class univFilter {
          public $univ_seg;
          public function filter($var) {
              if($var["EventType"] == "UN" && $var["LocationURL"] == $this->univ_seg)
                  return true;
                else
                  return false;
          }
      }
      
      $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/11/30","LocZipCode"=>"92108","LocationURL"=>"BU","EventType"=>"UN"),
          Array("StartDate"=>"2014/09/30","LocZipCode"=>"78661","LocationURL"=>"BU","EventType"=>"UN")
      ));
      
      $univ_seg = "BU";
      getUA($data,$univ_seg);
      
      function getUA($data, $univ_seg) {
          $f = new univFilter();
          $f->univ_seg = $univ_seg;
          $univ_sched = json_decode($data, true);
          $data       = array_filter($univ_sched,array($f,"filter"));
          print_r($data);
      }
      

      【讨论】:

      • 如果你需要传递 2 个参数怎么办
      【解决方案4】:

      为什么不尝试使用匿名函数呢?我发现回调可以更好地使用它

      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); 
      }
      

      【讨论】:

      • 你需要 use 喜欢 ...function($var) use($univ_seg) {
      • 如果你要在多个地方调用它,那么使用函数是有意义的。
      • @Yoshi 在这种情况下不是。 See example 1 here
      • @JaredFarrish 虽然这是真的,但它也不常见,OP 没有显示在任何地方使用的函数,而是作为回调。
      • 没有use $univ_seg 将在array_filter 的回调中未定义。目前您会收到Notice: Undefined variable: univ_seg 警告。 3v4l.org/iTuco
      猜你喜欢
      • 2011-07-25
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 2012-10-11
      • 2012-01-04
      • 1970-01-01
      • 2011-02-01
      • 2016-12-31
      相关资源
      最近更新 更多