我在使用usort函数排序我的类时遇到问题。我无法正确排序列表。 事实上,如果我打电话两次我的功能,给我不同的结果!
我将拥有一组Insignia对象,每个对象中都有一个Categoria对象列表,我需要按其ID属性对Categoria列表进行排序。
您可以复制this online tester上的下一个代码进行检查。
class Insignia{
var $id = 0;
var $nombre = "";
var $nombre_en = "";
var $imagen = "";
var $id_area = 0;
var $id_fase = 0;
var $id_estado = 0;
var $id_hotel = 0;
var $editable = 0;
var $lstCategorias = array();//this array contains a list of Categoria objects
function __construct($id, $nombre, $nombre_en, $imagen, $id_area, $id_fase, $id_estado, $id_hotel, $lstCategorias = array(), $editable = 1){
$this->id = $id;
$this->nombre = $nombre;
$this->nombre_en = $nombre_en;
$this->imagen = $imagen;
$this->id_area = $id_area;
$this->id_fase = $id_fase;
$this->id_estado = $id_estado;
$this->id_hotel = $id_hotel;
$this->editable = $editable;
$this->lstCategorias = $lstCategorias;
}
public function OrdenarPorMinimoVotos($orden = 'asc'){
if($orden === 'asc'){
usort($this->lstCategorias, array("Categoria", "compararMinimoVotosAsc"));
}
elseif($orden === 'desc'){
usort($this->lstCategorias, array("Categoria", "compararMinimoVotosDesc"));
}
}
}
class Categoria{
var $id = 0;
var $nombre = '';
var $nombre_en = '';
var $color = '';
var $color_fondo = '';
var $editable = 0;
var $minimo_votos = 0;
var $minimo_ideas = 0;
function __construct($id, $nombre, $nombre_en, $color, $color_fondo, $minimo_votos, $minimo_ideas, $editable = 1){
$this->id = (int)$id;
$this->nombre = $nombre;
$this->nombre_en = $nombre_en;
$this->color = $color;
$this->color_fondo = $color_fondo;
$this->minimo_votos = (int)$minimo_votos;
$this->minimo_ideas = (int)$minimo_ideas;
$this->editable = $editable;
}
static function compararMinimoVotosAsc($cat1, $cat2){
if ($cat1->minimo_votos == $cat2->minimo_votos) {
$cmp = 0;
}
$cmp = ($cat1->minimo_votos < $cat2->minimo_votos) ? -1 : 1;
return $cmp;
}
static function compararMinimoVotosDesc($cat1, $cat2){
if ($cat1->minimo_votos == $cat2->minimo_votos) {
return 0;
}
return ((int)$cat1->minimo_votos > (int)$cat2->minimo_votos) ? -1 : 1;
}
static function compararMinimoIdeas($cat1, $cat2){
if ($cat1->minimo_ideas == $cat2->minimo_ideas) {
return 0;
}
return ($cat1->minimo_ideas < $cat2->minimo_ideas) ? -1 : 1;
}
}
//this are my data...
$insignias = unserialize('a:4:{i:0;O:8:"Insignia":10:{s:2:"id";s:1:"1";s:6:"nombre";s:33:"Has conseguido 10 ideas aprobadas";s:9:"nombre_en";s:33:"You had reached 10 approbed ideas";s:6:"imagen";s:14:"fa-thumbs-o-up";s:7:"id_area";s:1:"0";s:7:"id_fase";s:1:"0";s:9:"id_estado";s:1:"0";s:8:"id_hotel";s:1:"0";s:8:"editable";s:1:"0";s:13:"lstCategorias";a:4:{i:0;O:9:"Categoria":8:{s:2:"id";i:1;s:6:"nombre";s:3:"Oro";s:9:"nombre_en";s:4:"Gold";s:5:"color";s:7:"#FFD700";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:150;}i:1;O:9:"Categoria":8:{s:2:"id";i:2;s:6:"nombre";s:5:"Plata";s:9:"nombre_en";s:6:"Silver";s:5:"color";s:7:"#C0C0C0";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:50;}i:2;O:9:"Categoria":8:{s:2:"id";i:3;s:6:"nombre";s:6:"Bronce";s:9:"nombre_en";s:6:"Bronze";s:5:"color";s:7:"#CD7F32";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:10;}i:3;O:9:"Categoria":8:{s:2:"id";i:4;s:6:"nombre";s:4:"Azul";s:9:"nombre_en";s:4:"Blue";s:5:"color";s:7:"#1E90FF";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:1;}}}i:1;O:8:"Insignia":10:{s:2:"id";s:1:"2";s:6:"nombre";s:38:"Has conseguido 100 votos con tus ideas";s:9:"nombre_en";s:40:"You had reached 100 votes for your ideas";s:6:"imagen";s:7:"fa-star";s:7:"id_area";s:1:"0";s:7:"id_fase";s:1:"0";s:9:"id_estado";s:1:"0";s:8:"id_hotel";s:1:"0";s:8:"editable";s:1:"0";s:13:"lstCategorias";a:4:{i:0;O:9:"Categoria":8:{s:2:"id";i:1;s:6:"nombre";s:3:"Oro";s:9:"nombre_en";s:4:"Gold";s:5:"color";s:7:"#FFD700";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:250;s:12:"minimo_ideas";i:0;}i:1;O:9:"Categoria":8:{s:2:"id";i:2;s:6:"nombre";s:5:"Plata";s:9:"nombre_en";s:6:"Silver";s:5:"color";s:7:"#C0C0C0";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:100;s:12:"minimo_ideas";i:0;}i:2;O:9:"Categoria":8:{s:2:"id";i:3;s:6:"nombre";s:6:"Bronce";s:9:"nombre_en";s:6:"Bronze";s:5:"color";s:7:"#CD7F32";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:25;s:12:"minimo_ideas";i:0;}i:3;O:9:"Categoria":8:{s:2:"id";i:4;s:6:"nombre";s:4:"Azul";s:9:"nombre_en";s:4:"Blue";s:5:"color";s:7:"#1E90FF";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:1;s:12:"minimo_ideas";i:0;}}}i:2;O:8:"Insignia":10:{s:2:"id";s:1:"3";s:6:"nombre";s:22:"Has propuesto 50 ideas";s:9:"nombre_en";s:21:"You had send 50 ideas";s:6:"imagen";s:14:"fa-lightbulb-o";s:7:"id_area";s:1:"0";s:7:"id_fase";s:1:"0";s:9:"id_estado";s:1:"0";s:8:"id_hotel";s:1:"0";s:8:"editable";s:1:"0";s:13:"lstCategorias";a:4:{i:0;O:9:"Categoria":8:{s:2:"id";i:1;s:6:"nombre";s:3:"Oro";s:9:"nombre_en";s:4:"Gold";s:5:"color";s:7:"#FFD700";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:50;}i:1;O:9:"Categoria":8:{s:2:"id";i:2;s:6:"nombre";s:5:"Plata";s:9:"nombre_en";s:6:"Silver";s:5:"color";s:7:"#C0C0C0";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:25;}i:2;O:9:"Categoria":8:{s:2:"id";i:3;s:6:"nombre";s:6:"Bronce";s:9:"nombre_en";s:6:"Bronze";s:5:"color";s:7:"#CD7F32";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:10;}i:3;O:9:"Categoria":8:{s:2:"id";i:4;s:6:"nombre";s:4:"Azul";s:9:"nombre_en";s:4:"Blue";s:5:"color";s:7:"#1E90FF";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:1;}}}i:3;O:8:"Insignia":10:{s:2:"id";s:1:"4";s:6:"nombre";s:48:"Has conseguido que se implemente tu primera idea";s:9:"nombre_en";s:43:"You had reached your first implemented idea";s:6:"imagen";s:6:"fa-cog";s:7:"id_area";s:1:"0";s:7:"id_fase";s:1:"0";s:9:"id_estado";s:1:"0";s:8:"id_hotel";s:1:"0";s:8:"editable";s:1:"0";s:13:"lstCategorias";a:4:{i:0;O:9:"Categoria":8:{s:2:"id";i:1;s:6:"nombre";s:3:"Oro";s:9:"nombre_en";s:4:"Gold";s:5:"color";s:7:"#FFD700";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:150;}i:1;O:9:"Categoria":8:{s:2:"id";i:2;s:6:"nombre";s:5:"Plata";s:9:"nombre_en";s:6:"Silver";s:5:"color";s:7:"#C0C0C0";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:50;}i:2;O:9:"Categoria":8:{s:2:"id";i:3;s:6:"nombre";s:6:"Bronce";s:9:"nombre_en";s:6:"Bronze";s:5:"color";s:7:"#CD7F32";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:10;}i:3;O:9:"Categoria":8:{s:2:"id";i:4;s:6:"nombre";s:4:"Azul";s:9:"nombre_en";s:4:"Blue";s:5:"color";s:7:"#1E90FF";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:1;}}}}a:4:{i:0;O:8:"Insignia":10:{s:2:"id";s:1:"1";s:6:"nombre";s:33:"Has conseguido 10 ideas aprobadas";s:9:"nombre_en";s:33:"You had reached 10 approbed ideas";s:6:"imagen";s:14:"fa-thumbs-o-up";s:7:"id_area";s:1:"0";s:7:"id_fase";s:1:"0";s:9:"id_estado";s:1:"0";s:8:"id_hotel";s:1:"0";s:8:"editable";s:1:"0";s:13:"lstCategorias";a:4:{i:0;O:9:"Categoria":8:{s:2:"id";i:1;s:6:"nombre";s:3:"Oro";s:9:"nombre_en";s:4:"Gold";s:5:"color";s:7:"#FFD700";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:150;}i:1;O:9:"Categoria":8:{s:2:"id";i:2;s:6:"nombre";s:5:"Plata";s:9:"nombre_en";s:6:"Silver";s:5:"color";s:7:"#C0C0C0";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:50;}i:2;O:9:"Categoria":8:{s:2:"id";i:3;s:6:"nombre";s:6:"Bronce";s:9:"nombre_en";s:6:"Bronze";s:5:"color";s:7:"#CD7F32";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:10;}i:3;O:9:"Categoria":8:{s:2:"id";i:4;s:6:"nombre";s:4:"Azul";s:9:"nombre_en";s:4:"Blue";s:5:"color";s:7:"#1E90FF";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:1;}}}i:1;O:8:"Insignia":10:{s:2:"id";s:1:"2";s:6:"nombre";s:38:"Has conseguido 100 votos con tus ideas";s:9:"nombre_en";s:40:"You had reached 100 votes for your ideas";s:6:"imagen";s:7:"fa-star";s:7:"id_area";s:1:"0";s:7:"id_fase";s:1:"0";s:9:"id_estado";s:1:"0";s:8:"id_hotel";s:1:"0";s:8:"editable";s:1:"0";s:13:"lstCategorias";a:4:{i:0;O:9:"Categoria":8:{s:2:"id";i:1;s:6:"nombre";s:3:"Oro";s:9:"nombre_en";s:4:"Gold";s:5:"color";s:7:"#FFD700";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:250;s:12:"minimo_ideas";i:0;}i:1;O:9:"Categoria":8:{s:2:"id";i:2;s:6:"nombre";s:5:"Plata";s:9:"nombre_en";s:6:"Silver";s:5:"color";s:7:"#C0C0C0";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:100;s:12:"minimo_ideas";i:0;}i:2;O:9:"Categoria":8:{s:2:"id";i:3;s:6:"nombre";s:6:"Bronce";s:9:"nombre_en";s:6:"Bronze";s:5:"color";s:7:"#CD7F32";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:25;s:12:"minimo_ideas";i:0;}i:3;O:9:"Categoria":8:{s:2:"id";i:4;s:6:"nombre";s:4:"Azul";s:9:"nombre_en";s:4:"Blue";s:5:"color";s:7:"#1E90FF";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:1;s:12:"minimo_ideas";i:0;}}}i:2;O:8:"Insignia":10:{s:2:"id";s:1:"3";s:6:"nombre";s:22:"Has propuesto 50 ideas";s:9:"nombre_en";s:21:"You had send 50 ideas";s:6:"imagen";s:14:"fa-lightbulb-o";s:7:"id_area";s:1:"0";s:7:"id_fase";s:1:"0";s:9:"id_estado";s:1:"0";s:8:"id_hotel";s:1:"0";s:8:"editable";s:1:"0";s:13:"lstCategorias";a:4:{i:0;O:9:"Categoria":8:{s:2:"id";i:1;s:6:"nombre";s:3:"Oro";s:9:"nombre_en";s:4:"Gold";s:5:"color";s:7:"#FFD700";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:50;}i:1;O:9:"Categoria":8:{s:2:"id";i:2;s:6:"nombre";s:5:"Plata";s:9:"nombre_en";s:6:"Silver";s:5:"color";s:7:"#C0C0C0";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:25;}i:2;O:9:"Categoria":8:{s:2:"id";i:3;s:6:"nombre";s:6:"Bronce";s:9:"nombre_en";s:6:"Bronze";s:5:"color";s:7:"#CD7F32";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:10;}i:3;O:9:"Categoria":8:{s:2:"id";i:4;s:6:"nombre";s:4:"Azul";s:9:"nombre_en";s:4:"Blue";s:5:"color";s:7:"#1E90FF";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:1;}}}i:3;O:8:"Insignia":10:{s:2:"id";s:1:"4";s:6:"nombre";s:48:"Has conseguido que se implemente tu primera idea";s:9:"nombre_en";s:43:"You had reached your first implemented idea";s:6:"imagen";s:6:"fa-cog";s:7:"id_area";s:1:"0";s:7:"id_fase";s:1:"0";s:9:"id_estado";s:1:"0";s:8:"id_hotel";s:1:"0";s:8:"editable";s:1:"0";s:13:"lstCategorias";a:4:{i:0;O:9:"Categoria":8:{s:2:"id";i:1;s:6:"nombre";s:3:"Oro";s:9:"nombre_en";s:4:"Gold";s:5:"color";s:7:"#FFD700";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:150;}i:1;O:9:"Categoria":8:{s:2:"id";i:2;s:6:"nombre";s:5:"Plata";s:9:"nombre_en";s:6:"Silver";s:5:"color";s:7:"#C0C0C0";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:50;}i:2;O:9:"Categoria":8:{s:2:"id";i:3;s:6:"nombre";s:6:"Bronce";s:9:"nombre_en";s:6:"Bronze";s:5:"color";s:7:"#CD7F32";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:10;}i:3;O:9:"Categoria":8:{s:2:"id";i:4;s:6:"nombre";s:4:"Azul";s:9:"nombre_en";s:4:"Blue";s:5:"color";s:7:"#1E90FF";s:11:"color_fondo";s:7:"#FFFFFF";s:8:"editable";s:1:"0";s:12:"minimo_votos";i:0;s:12:"minimo_ideas";i:1;}}}}');
$insignias[0]->OrdenarPorMinimoVotos('asc');
echo "asc:<pre>".print_r($insignias[0], true)."</pre>";
我正在调查这几个小时,我不知道错误在哪里...... 感谢...
答案 0 :(得分:1)
你的问题是,在每种情况下你在比较回调中执行第二次比较 - 即使两个minimo_votos相等。因此,对于相等的对象,您的比较函数永远不会返回0。
你应该像在compararMinimoIdeas中那样做。