usort función personalizada de comparación

NeB1

Buenas a todos,

Estoy creandome una clase, donde un método público es así:

	public function render ( $starting_level = 2, $ending_level = 2, $html_connector = array('<li>','</li>'), $self_item = TRUE, $name_prefix = "" )
		{
			$items = $this->brothers;
			if($self_item) 
			{
				$items[] = $this->selected_item;
				[b]usort($items,'_menu_sort_');[/b]
			}
			$htmlOutput = $html_connector[0];
			foreach($items as $id => $item){
			
			$name_prefix_tokenized = $this->tokenize_string( $name_prefix , $item, $id );
			$htmlOutput .=$html_connector[0]."<a href='?page_id=".$item['id']."'>". $name_prefix_tokenized . $item['name'] ."</a>".$html_connector[1];
			
		}
		print $htmlOutput;
	
	}

Donde veis que está resaltado en negrita (entre b y /b, que la negrita no se puede mezclar con code), es para hacer uso de una función personalizada de comparación, que es la que sigue:


function _menu_sort_($a, $b)
	{
		return $a['id'] > $b['id'];
	}

De acuerdo, todo funciona genial, siempre y cuando, la función menu_sort se defina fuera de la clase, pero me gustaría poder encapsular dicha función dentro de la clase, del rollo:

     private function _menu_sort_($a, $b)
		{
			return $a['id'] > $b['id'];
		}


public function render ( $starting_level = 2, $ending_level = 2, $html_connector = array('<li>','</li>'), $self_item = TRUE, $name_prefix = "" )
	{
		$items = $this->brothers;
		if($self_item) 
		{
			$items[] = $this->selected_item;
			[b]usort($items,'_menu_sort_');[/b]
		}
		$htmlOutput = $html_connector[0];
		foreach($items as $id => $item){
		
			$name_prefix_tokenized = $this->tokenize_string( $name_prefix , $item, $id );
			$htmlOutput .=$html_connector[0]."<a href='?page_id=".$item['id']."'>". $name_prefix_tokenized . $item['name'] ."</a>".$html_connector[1];
			
		}
		print $htmlOutput;
	
	}

Pero así si que no funciona, parece que no encuentra la función menu_sort, lo cual es más bien lógico, la he definido como privada y como pública, así que eso no es. También he provado:

[b]usort($items,'$this->_menu_sort_');[/b]
[b]usort($items,$this->_menu_sort_());[/b]
[b]usort($items,$this->_menu_sort_($a, $b));[/b]
usort($items,'menu::_menu_sort_');

etc. Sé que la mayoría de cosas son ilógicas xD pero es que ésta opción:

usort($items,$this->menu_sort());

ha conseguido llamar a la función de comparación, pero me ha dado error porque no tenía los parámetros que la función pide.

Resumen: Se puede hacer lo que yo quiero? es decir, definir la función de comparación dentro de la clase, y si puede ser, como elemento privado?

Pd: el nombre de la clase es 'menu'

LOc0
Puedes probar con:

usort($array, array($this, '_menu_sort_')); //_menu_sort_ definida public

Tb puedes probar a declarar la función como public static _menu_sort_ y hacer

usort($array, Clase::_menu_sort_);

Ó puedes usar una función anónima

usort($array, create_function('$a, $b', 'return ($a[\'id\'] < $b[\'id\'])?-1:(($a[\'id\'] > $b[\'id\'])?1:0);'));

Salu2 ;)

NeB1

#2 no me ha funcionado ninguna (la segunda, no sabía que había que declarla static para poder acceder con el scope) :(

BTW acabo de descubrir lo de create_function y lo de static, así que gracias igualmente, eres un crack xD

LOc0

Recuerda que la función de comparación($a, $b) TIENE QUE devolver negativo ($a<$b), cero($a==$b) ó positivo ($a>$b) para que usort pueda ordenar.

Salu2 ;)

NeB1

#4 si si, la función va guay, simplemente no consigo meterla dentro de la clase, tengo que declarla fuera de la clase como una función genérica, lo cual no supone gran problema, pero me apetecía tenerlo más ordenadito, gracias de todas formas ^^

Usuarios habituales

  • NeB1
  • LOc0