【问题标题】:Comparator functions for alphabetic sorting with anonymous functions [closed]使用匿名函数进行字母排序的比较器函数[关闭]
【发布时间】:2012-10-06 11:59:16
【问题描述】:

我有一个二维数组,想按名称对其进行排序。我想将usort() 与匿名函数一起使用。当我想按字母顺序排序时,我的比较器函数应该是什么样子?

[names] => Array
(
    [0] => Array
        (
            [name] => Baba
            [prename] => Ali
        )

    [1] => Array
        (
            [name] => Pan
            [prename] => Peter
        )

)

为了排序,我试过这个:

usort($names, function cmp($a, $b) {
    return strcmp($a['name'], $b['name']);
});

在第一行给我unexpected T_STRING, expecting '('

【问题讨论】:

标签: php syntax-error anonymous-function sorting


【解决方案1】:

你可以使用usort

$names = Array(
"0" => Array("name" => "B","prename" => "A"),
"1" => Array("name" => "D","prename" => "B"),
"2" => Array("name" => "A","prename" => "C"),
"3" => Array("name" => "B","prename" => "D")

        );

示例 1

__xsort($names,"name");
var_dump($names);

输出

array
  0 => 
    array
      'name' => string 'A' (length=1)
      'prename' => string 'C' (length=1)
  1 => 
    array
      'name' => string 'B' (length=1)
      'prename' => string 'A' (length=1)
  2 => 
    array
      'name' => string 'B' (length=1)
      'prename' => string 'D' (length=1)
  3 => 
    array
      'name' => string 'D' (length=1)
      'prename' => string 'B' (length=1)

示例 2

__xsort($names,"prename");
var_dump($names);

输出

array
  0 => 
    array
      'name' => string 'B' (length=1)
      'prename' => string 'A' (length=1)
  1 => 
    array
      'name' => string 'D' (length=1)
      'prename' => string 'B' (length=1)
  2 => 
    array
      'name' => string 'A' (length=1)
      'prename' => string 'C' (length=1)
  3 => 
    array
      'name' => string 'B' (length=1)
      'prename' => string 'D' (length=1))

使用的功能

function __xsort(&$names,$key) {
    usort($names, function ($a, $b) use($key) {
        if ($a[$key] == $b[$key]) {
            return 0;
        }
        return ($a[$key] < $b[$key]) ? - 1 : 1;
    });

    return $names;
}

【讨论】:

  • +1 这个通用数组排序功能,谢谢。
  • php 有array_multisort
  • @hakre 你不能用array_multisort 中的键进行排序也一直在寻找你能不能帮我看看stackoverflow.com/questions/12759011/… ... 我想你对PHP 内部的了解要好很多
  • @Baba:当然你可以用键排序,但是你更想念array_column function 我觉得。另见:wiki.php.net/rfc/array_column
  • @Baba:你得到你想要排序的列的数组,然后你使用multisort。完毕。这就是 array_column 如何对多维数组进行排序。
【解决方案2】:

这个 bug 不是很明显,但再次思考匿名函数的概念,我得到了提示。函数名不能在那里。我的确切问题的正确解决方案是

usort($names, function ($a, $b) {
    return strcmp($a['name'], $b['name']);
});

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2020-05-28
    • 2020-10-24
    • 1970-01-01
    相关资源
    最近更新 更多