【问题标题】:Sorting an array using usort and a dynamic generated function使用 usort 和动态生成的函数对数组进行排序
【发布时间】:2012-01-25 09:00:40
【问题描述】:

我正在使用 php 函数 usort 对数组进行排序。必须生成自定义的php函数,因为它是动态的

$intCompareField = 2;
$functSort = function($a, $b) {
  return ($a[$intCompareField] > $a[$intCompareField])?1:-1;
}

usort($arrayToSort, $functSort);

比较函数中的$intCompareField 为空,我猜是因为$intCompareField 是在函数外部声明的。设置global $intCompareField 似乎不起作用。

Ps:我使用$intCompareField,因为要排序的数组是多维的,我希望能够对数组中的哪个键进行排序。

【问题讨论】:

  • 您确定只返回1-1,通常希望返回0 以获得“相等”的值。
  • 我知道,但我想保持函数简短。感谢强硬的评论
  • 那么,你更喜欢 short and broken 而不是 short ——虽然不像以前那么短—— 并且工作?祝你好运!

标签: php sorting usort


【解决方案1】:

虽然Dor Shemer's answer 就足够了,但我发现拥有一个生成所需比较函数的函数通常会更好。

$functSort = function ($field) {
    return function($a, $b) use ($field) {
        // Do your comparison here
    };
};

$intCompareField = 2;
usort($arrayToSort, $functSort($intCompareField));

您可以将$functSort 中的函数设为命名函数(例如sort_by_field_factory() 或其他合适的名称),不需要它是匿名函数。

【讨论】:

    【解决方案2】:

    尝试添加use,它将变量从外部作用域传递给匿名函数

    function($a, $b) use ($intCompareField) {
         return ($a[$intCompareField] > $a[$intCompareField])?1:-1;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多