Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP排序函数,用于对对象数组进行排序_Php_Sorting - Fatal编程技术网

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

PHP排序函数,用于对对象数组进行排序,php,sorting,Php,Sorting,我有一个数组,里面充满了来自同一个类的对象。我想按可选对象字段对该数组进行排序,例如$case->ID或$case->Sender 是否有一个内置的array_sort()函数已经完成了这项工作,或者我必须自己编写这个排序函数 答案不必详细解释——这更像是一个“是/否”问题 谢谢 我尝试usort失败: function sortBy($sort) { usort($this->abuseCases, function($a, $b) { if($a->{$so

我有一个数组,里面充满了来自同一个类的对象。我想按可选对象字段对该数组进行排序,例如
$case->ID
$case->Sender

是否有一个内置的array_sort()函数已经完成了这项工作,或者我必须自己编写这个排序函数

答案不必详细解释——这更像是一个“是/否”问题

谢谢


我尝试usort失败:

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;
    });
  }
函数排序方式($sort)
{
usort($this->abuseCases,函数($a,$b){
if($a->{$sort}>$b->{$sort})返回1;
if($a->{$sort}<$b->{$sort})返回-1;
否则返回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;
    }
函数排序方式($sort)
{
$this->sortBy=$sort;
usort($this->abuseCases,数组(“this”,“srt”));
}
专用功能srt($a,$b)
{
if($a->{$this->sortBy}>$b->{$this->sortBy})返回1;
如果($a->{$this->sortBy}<$b->{$this->sortBy})返回-1;
否则返回0;
}

为凹凸进行编辑

您可以将其用作:

在PHP>=5.3中,还可以使用匿名函数:

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

您将不得不编写它,但它非常琐碎:


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

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

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";
  }
}

更新:使用phppropName=$propertyName; } 公共职能比较($a$b){ $prop=$this->propName; 如果($a->$prop>$b->$prop)返回1; 如果($a->$prop<$b->$prop)返回-1; 返回0; } } 函数foo($a){ foreach($a作为$o){ 回显$o->ID',$o->发件人,“\n”; } } 函数getData(){ 返回数组( (对象)数组('ID'=>1,'Sender'=>'Sender A'), (对象)数组('ID'=>3,'Sender'=>'Sender D'), (对象)数组('ID'=>2,'Sender'=>'Sender C'), (对象)数组('ID'=>4,'Sender'=>'Sender B') ); }
(如果你大量使用这个-或者不想写这样的借口-你可能想定义一个像
接口比较器{…}
这样的接口,让Foo实现这个接口,并拥有一些使用比较器的函数/类,即围绕usort()的对象的包装器。)

从设计角度来看,更好的选择是使用专用对象(如CasesCollection)而不是普通数组。您可以将sort key设置为该对象的成员,并在排序回调中将其称为
$this->sortKey

谢谢你的回复。您知道有什么方法可以将预定义变量放入这个排序函数中吗?我的尝试失败了(我已将其编辑到主要帖子中)为什么失败?您看到了什么结果?在第一次尝试中,显然没有找到$sort。在第二次尝试中,我不知道如何引用函数“srt”。它可以完美地工作。谢谢如果有一个相同结果的版本需要更少的代码,我也希望看到:PSorry证明PHP5.3不可用-我需要另一个解决方案
function ($a,$b) use ($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
$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')
  );
}