PHP本地变量作用于usort的匿名函数

时间:2014-02-14 18:28:34

标签: php scope closures anonymous-function usort

我在2D数组中有一些表格数据。我在某个列值上按等号对表格数据进行了分区。具有相等列值的表格数据的所有行被放置在新的2D阵列中,并且所有2D阵列都存储在3D阵列中。

现在我想按列的值对每个2D分区中的行进行排序,并按照相等的列值对3D数组中的2D分区进行排序。

我编写了以下函数来对分区数据进行排序:

function sortPartitions($tableCol, $partitionCol, $partitioned3dData) {

  foreach($partitioned3dData as $table) {
    usort($table,
          function($a,$b) {
            return genCmp($a[$tableCol],
                          $b[$tableCol]);
          });

  }
  usort($partitioned3dData,
        function($a,$b) {
          return genCmp($a[0][$partitionCol],
                        $b[0][$partitionCol]);
        }); 

  return $partitioned3dData;
}

function genCmp($a,$b) {
  if($a==$b)
    return 0;
  else
    return ($a<$b) ? -1 : 1;
}

当我运行代码时出现以下错误:

Notice: Undefined variable: partitionCol in /path/to/file.php on line 1337.

为什么$tableCol的值成功传递到匿名函数的闭包中,但$partitionCol的值导致错误?

2 个答案:

答案 0 :(得分:4)

您需要使用use

将其传递到闭包范围
usort($partitioned3dData,
        function($a,$b) use ($partitionCol) {
          return genCmp($a[0][$partitionCol],
                        $b[0][$partitionCol]);
        }); 

答案 1 :(得分:1)

对于两个匿名函数,您必须use两个参数。如果我只使用$partitionCol,我会收到 Undfinied变量错误。

function sortPartitions($tableCol, $partitionCol, $partitioned3dData) {

    foreach($partitioned3dData as $table) {
        usort($table, function($a,$b) use ($tableCol) {
            return genCmp($a[$tableCol], $b[$tableCol]);
        });
    }

    usort($partitioned3dData, function($a,$b) use ($partitionCol) {
        return genCmp($a[0][$partitionCol], $b[0][$partitionCol]);
    }); 

    return $partitioned3dData;
}