微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个充满来自同一个类的对象的数组.我想通过可选对象字段对此数组进行排序,例如$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;
    }

编辑凹凸

您不仅可以使用匿名函数,还可以使用闭包,例如
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< 5.3,您可以使用对象而不是匿名函数.
usort()期望第二个参数是可调用的.从PHP 5.3开始,这可能是一个令人厌恶的函数,但它也可以是函数名称….或者作为数组传递的对象和方法名称,如数组($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,"\n";
  }
}
function getData() {
  return array(
    (object)array('ID'=>1,'Sender'=>'Sender B')
  );
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐