在PHP中sorting对象

什么是在PHP中sorting对象的优雅方式? 我很想完成类似的事情。

$sortedObjectArary = sort($unsortedObjectArray, $Object->weight); 

基本上指定我想要sorting的数组以及我要sorting的字段。 我研究了multidimensional arraysorting,可能有一些有用的东西,但我没有看到任何优雅或明显的东西。

几乎从手册逐字:

 function compare_weights($a, $b) { if($a->weight == $b->weight) { return 0; } return ($a->weight < $b->weight) ? -1 : 1; } usort($unsortedObjectArray, 'compare_weights'); 

如果你希望对象能够自己sorting,请看这里的例子3: http : //php.net/usort

对于php> = 5.3

 function osort(&$array, $prop) { usort($array, function($a, $b) use ($prop) { return $a->$prop > $b->$prop ? 1 : -1; }); } 

请注意,这使用匿名函数/闭包。 可能会发现审查有用的PHP文档。

你甚至可以build立sorting行为到你正在sorting的类,如果你想要这个级别的控制

 class thingy { public $prop1; public $prop2; static $sortKey; public function __construct( $prop1, $prop2 ) { $this->prop1 = $prop1; $this->prop2 = $prop2; } public static function sorter( $a, $b ) { return strcasecmp( $a->{self::$sortKey}, $b->{self::$sortKey} ); } public static function sortByProp( &$collection, $prop ) { self::$sortKey = $prop; usort( $collection, array( __CLASS__, 'sorter' ) ); } } $thingies = array( new thingy( 'red', 'blue' ) , new thingy( 'apple', 'orange' ) , new thingy( 'black', 'white' ) , new thingy( 'democrat', 'republican' ) ); print_r( $thingies ); thingy::sortByProp( $thingies, 'prop1' ); print_r( $thingies ); thingy::sortByProp( $thingies, 'prop2' ); print_r( $thingies ); 

对于这个比较函数,你可以做:

 function cmp( $a, $b ) { return $b->weight - $a->weight; } 

usortfunction( http://uk.php.net/manual/en/function.usort.php )是你的朋友。 就像是…

 function objectWeightSort($lhs, $rhs) { if ($lhs->weight == $rhs->weight) return 0; if ($lhs->weight > $rhs->weight) return 1; return -1; } usort($unsortedObjectArray, "objectWeightSort"); 

请注意,任何数组键都将丢失。

您可以使用usort()函数并创build自己的比较函数。

 $sortedObjectArray = usort($unsortedObjectArray, 'sort_by_weight'); function sort_by_weight($a, $b) { if ($a->weight == $b->weight) { return 0; } else if ($a->weight < $b->weight) { return -1; } else { return 1; } } 

根据你正在尝试解决的问题,你也可以find有用的SPL接口。 例如,实现ArrayAccess接口将允许您像访问数组一样访问您的类。 此外,实现SeekableIterator接口可以让你循环你的对象就像一个数组。 这样你可以对你的对象进行sorting,就像它是一个简单的数组一样,完全控制给定键返回的值。

更多细节:

  • Zend条款
  • PHPriot文章
  • PHP手册
 function PHPArrayObjectSorter($array,$sortBy,$direction='asc') { $sortedArray=array(); $tmpArray=array(); foreach($this->$array as $obj) { $tmpArray[]=$obj->$sortBy; } if($direction=='asc'){ asort($tmpArray); }else{ arsort($tmpArray); } foreach($tmpArray as $k=>$tmp){ $sortedArray[]=$array[$k]; } return $sortedArray; } 

例如=>

 $myAscSortedArrayObject=PHPArrayObjectSorter($unsortedarray,$totalMarks,'asc'); $myDescSortedArrayObject=PHPArrayObjectSorter($unsortedarray,$totalMarks,'desc'); 

您可以使用与从Nspl中的已 sorting函数发布的代码几乎相同的代码:

 use function \nspl\a\sorted; use function \nspl\op\propertyGetter; use function \nspl\op\methodCaller; // Sort by property value $sortedByWeight = sorted($objects, propertyGetter('weight')); // Or sort by result of method call $sortedByWeight = sorted($objects, methodCaller('getWeight')); 

如果您想在PHP中探索lambda样式函数的完整(可怕的)范围,请参阅: http : //docs.php.net/manual/en/function.create-function.php