更好的PHP usort()

时间:2016-11-22 13:19:41

标签: php usort

我需要合并然后对具有不同数据结构的两个数组进行排序(不能在MySQL查询中排序),但两者都有created_on字段。

所以我使用usort()自定义函数。

在我的控制器中

usort(merged_array, 'sort_records');

在我的帮助函数中

if(!function_exists('sort_records')){
  function sort_records($a,$b){
    if ( $a['created_at'] == $b['created_at'] )
      return 0;
    if ( $a['created_at'] < $b['created_at'] )
       return -1;
    return 1;
  } 
}

我想让这个sort_records()函数可重用。所以我可以将它与其他数组一起使用。也许像..

function sort_records($a,$b,$index){
  if ( $a[$index] == $b[$index] )
     return 0;
  if ( $a[$index] < $b[$index] )
     return -1;
  return 1;

这可能与usort()一起使用,因为当您调用该函数时它根本不接受参数吗?还有其他选择吗?

3 个答案:

答案 0 :(得分:3)

您可以创建一个类

class SortRecord
{
    private $index;

    public function __construct($index)
    {
        $this->index = $index;
    }

    public function sort_records($a, $b)
    {
        if ( $a[$this->index] == $b[$this->index] )
            return 0;
        if ( $a[$this->index] < $b[$this->index] )
            return -1;
        return 1;
    }
}

然后您可以将其传递给usort

$obj = new SortRecord('created_at');
usort($merged_array, array($obj, 'sort_records'));

答案 1 :(得分:2)

usort放入sort_records并使用匿名函数,如下所示:

function sort_records(&$array,$index){
    return usort($array, function ($a, $b) use ($index) {
        if ( $a[$index] == $b[$index] )
            return 0;
        if ( $a[$index] < $b[$index] )
            return -1;
        return 1;
    });
}

然后你可以用你需要的任何索引来调用它

sort_records($array, 'created_at');

答案 2 :(得分:0)

你也可以在你的usort上使用use关键字,但你必须将内部函数声明为anonymous

function better_usort($array, $index) {
    return usort($array, function($a, $b) use($index){
        if ($a[$index] == $b[$index])
            return 0;
        if ($a[$index] < $b[$index])
            return -1;
        return 1;
    });
}

然后你可以用

来调用它
better_usort($merged_array, 'created_at');