PHP排序函数,用于排序对象数组

时间:2010-09-20 06:24:56

标签: php sorting

我有一个完整的来自同一个类的对象的数组。我想通过可选对象字段对此数组进行排序,例如$case->ID$case->Sender

是否有一个内置的array_sort()函数可以执行此操作,或者我是否必须自己编写此类函数?

答案不必详细解释 - 这更像是/否问题

由于


我尝试失败的尝试:

function sortBy($sort)
  {
   usort($this->abuseCases, function($a, $b) {
     if($a->{$sort} > $b->{$sort}) return 1;
     if($a->{$sort} < $b->{$sort}) return -1;
     else return 0;
    });
  }

另一次尝试失败:

    function sortBy($sort)
    {
        $this->sortBy = $sort;

        usort($this->abuseCases, array("this", "srt"));
    }

    private function srt($a, $b)
    {
        if($a->{$this->sortBy} > $b->{$this->sortBy}) return 1;
        if($a->{$this->sortBy} < $b->{$this->sortBy}) return -1;
        else return 0;
    }

编辑凹凸

5 个答案:

答案 0 :(得分:10)

您不仅可以使用匿名函数,还可以使用闭包,例如

function ($a,$b) use ($sort) { ... }

和$ sort将在函数体中可用。 自足的例子:

<?php
function getFn($sort) {
  return function($a, $b) use($sort) {
    if($a->$sort > $b->$sort) return 1;
    if($a->$sort < $b->$sort) return -1;
    return 0;
  };
}

$abuseCases = array(
  (object)array('ID'=>1, 'Sender'=>'Sender A'),
  (object)array('ID'=>3, 'Sender'=>'Sender D'),
  (object)array('ID'=>2, 'Sender'=>'Sender C'),
  (object)array('ID'=>4, 'Sender'=>'Sender B')
);

echo "\n----- Sort By Sender ----\n";
usort($abuseCases, getFn('Sender'));
foo($abuseCases);

echo "\n----- Sort By ID ----\n";
usort($abuseCases, getFn('ID'));
foo($abuseCases);

function foo($a) {
  foreach($a as $o) {
    echo $o->ID, ' ', $o->Sender, "\n";
  }
}

打印

----- Sort By Sender ----
1 Sender A
4 Sender B
2 Sender C
3 Sender D

----- Sort By ID ----
1 Sender A
2 Sender C
3 Sender D
4 Sender B

更新:使用php&lt; 5.3,您可以使用对象而不是匿名函数。 usort()期望第二个参数为callable。从php 5.3开始,这可能是一个令人厌恶的函数,但它也可以是函数的名称....或者作为像array($obj, 'methodName')这样的数组传递的对象和方法名称。

$abuseCases = getData();
echo "\n----- Sort By Sender ----\n";
usort($abuseCases, array(new Foo('Sender'), 'compare'));
foo($abuseCases);

echo "\n----- Sort By ID ----\n";
usort($abuseCases, array(new Foo('ID'), 'compare'));
foo($abuseCases);

class Foo {
  public $propName; // protected?
  public function __construct($propertyName) {
    $this->propName = $propertyName;
  }
  public function compare($a, $b) {
    $prop = $this->propName;
    if($a->$prop > $b->$prop) return 1;
    if($a->$prop < $b->$prop) return -1;
    return 0;
  }
}

function foo($a) {
  foreach($a as $o) {
    echo $o->ID, ' ', $o->Sender, "\n";
  }
}
function getData() {
  return array(
    (object)array('ID'=>1, 'Sender'=>'Sender A'),
    (object)array('ID'=>3, 'Sender'=>'Sender D'),
    (object)array('ID'=>2, 'Sender'=>'Sender C'),
    (object)array('ID'=>4, 'Sender'=>'Sender B')
  );
}

(如果你大量使用它 - 或者不想写这样的借口 - 你可能想要定义像interface Comparator { ... }这样的接口,让Foo实现该接口并具有一些功能/ class使用Comparator,即usort()周围对象的包装器。)

答案 1 :(得分:7)

您可以将usort用作:

function cmp( $a, $b ) {    
  return ($a->ID - $b->ID); // assuming numeric ID
} 

usort($arrayOfObjects,'cmp');

在PHP&gt; = 5.3中,您也可以使用匿名函数:

usort($arrayOfObjects, function($a, $b) {
        return $a->ID - $b->ID;
    });

答案 2 :(得分:0)

你必须写它,但usort()

非常简单
function my_obj_sort($a, $b) {
    return strnatcasecmp($a->Sender, $b->Sender);
}

usort($cases, 'my_obj_sort');

答案 3 :(得分:0)

你应该看看usort()函数。它接受一个自定义排序的回调,这就是你想要的。

答案 4 :(得分:0)

从设计POV中,更好的选择是使用专用对象(如CasesCollection)而不是普通数组。您可以使排序键成为此对象的成员,并在排序回调中将其简单地称为$this->sortKey