【问题标题】:Nested function with PHPPHP的嵌套函数
【发布时间】:2016-09-17 10:25:35
【问题描述】:

我正在编写自定义排序功能。当前(非工作)代码如下所示:

<?php
 function sort_by_key($array, $key) {

   function custom_compare ($a, $b) {
     if ($a[$key][0] > $b[$key][0]) { return 1; }
     else { return -1; }
     }
  return usort($array, "custom_compare");
 }
?>

问题是我无法将 $key 变量传递给 custom_compare 函数。我想避免使用全局变量(丑陋的编码)。

【问题讨论】:

  • 通过进一步阅读,我注意到 PHP 不支持嵌套函数。我的代码在第二次运行时返回错误,PHP 尝试重新声明 custom_compare -function。除了全局变量还有其他选项吗?我无法将更多参数传递给 custom_compare,因为它被 usort 使用。

标签: php scope


【解决方案1】:

未经测试,但您可以使用匿名函数:

<?php
 function sort_by_key($array, $key) {

   $custom_compare = function ($a, $b) use ($key) {
     if ($a[$key][0] > $b[$key][0]) { return 1; }
     else { return -1; }
     };

  return usort($array, $custom_compare);
 }

基于对现有函数的小修改。

进一步你的功能仍然需要一个小的改变:

<?php
function sort_by_key(&$array, $key) {
    $custom_compare = function ($a, $b) use ($key) {
        if ($a[$key][0] > $b[$key][0]) {
            return 1;
        } else {
            return -1;
        }
    };

    usort($array, $custom_compare);
}

$array = array(
    array(
        'foo' => array(
            2
        )
    ),
    array(
        'foo' => array(
            3
        )
    ),
    array(
        'foo' => array(
            1
        )
    )
);

sort_by_key($array, 'foo');
var_export($array);

输出:

array (
  0 => 
  array (
    'foo' => 
    array (
      0 => 1,
    ),
  ),
  1 => 
  array (
    'foo' => 
    array (
      0 => 2,
    ),
  ),
  2 => 
  array (
    'foo' => 
    array (
      0 => 3,
    ),
  ),
)

【讨论】:

  • 感谢您的回复,但这不起作用。而是给出以下错误:PHP Parse error: syntax error, unexpected 'use' (T_USE), expecting '{'
  • 对不起......我的错......一个愚蠢的错误,我做了function custom_compare($a, $b) use ($key),而不是$custom_compare = function($a, $b) use ($key)
猜你喜欢
  • 2011-07-20
  • 2017-03-29
  • 2014-05-25
  • 2011-05-10
  • 1970-01-01
  • 2010-09-29
  • 2010-12-18
  • 1970-01-01
相关资源
最近更新 更多