bloqueado con PHP

NeB1

A ver, me han pedido que haga una función y me está costando mucho más de lo que me esperaba (en php).

Me pasan un vector de este tipo:

	$res[]['idParte']="1";
	$res[]['idParte']="3";
	$res[]['idParte']="2";
	$res[]['idParte']="4";
	$res[]['idParte']="1-1";
	$res[]['idParte']="1-2";
	$res[]['idParte']="1-3";
	$res[]['idParte']="1-4";
	$res[]['idParte']="1-5";
	$res[]['idParte']="1-6";
	$res[]['idParte']="1-7";
	$res[]['idParte']="1-8";
	$res[]['idParte']="1-9";
	$res[]['idParte']="1-10";
	$res[]['idParte']="1-11";
	$res[]['idParte']="1-1-1";
	$res[]['idParte']="1-1-2";
	$res[]['idParte']="1-1-3";
	$res[]['idParte']="1-1-4";
	$res[]['idParte']="1-1-5";
	$res[]['idParte']="1-1-6";
	$res[]['idParte']="1-1-7";
	$res[]['idParte']="1-1-8";
	$res[]['idParte']="1-1-9";
	$res[]['idParte']="1-1-10";
	$res[]['idParte']="1-1-11";
	$res[]['idParte']="2-1-1";
	$res[]['idParte']="2-1-2";
	$res[]['idParte']="2-1-3";
	$res[]['idParte']="2-1-4";
	$res[]['idParte']="2-1-5";
	$res[]['idParte']="2-1-6";
	$res[]['idParte']="2-1-7";
	$res[]['idParte']="2-1-8";
	$res[]['idParte']="2-1-9";
	$res[]['idParte']="2-1-10";
	$res[]['idParte']="2-1-11";
	$res[]['idParte']="2-2-1";
	$res[]['idParte']="2-2-2";
	$res[]['idParte']="2-2-3";
	$res[]['idParte']="2-2-4";
	$res[]['idParte']="2-2-5";
	$res[]['idParte']="2-2-6";
	$res[]['idParte']="2-2-7";
	$res[]['idParte']="2-2-8";
	$res[]['idParte']="2-2-9";
	$res[]['idParte']="2-2-10";
	$res[]['idParte']="2-2-11";

pero completamente desordenado, y tengo que ordenarlo de forma que :

1
1-1
1-1-1
1-1-2
1-1-3

etc.

no vale un sort ni nada por el estilo porque quedaría así:

1
1-1
1-1-1
1-1-10
1-1-11
1-1-12
1-1-2

(como es CHAR el 10 va antes que el 2).

y eso, hay que hacer una función recursiva usando explode("-",$array) y empezar a ordenarlo por niveles, pero me estoy armando un jaleo de cojones xD

alguna solución sencilla y fácil, porque creo que me estoy ofuscando para una tonteria...

LOc0

Me piro a comer. De momento vete probando con http://us.php.net/manual/en/function.natsort.php

Salu2 ;)

guner

Very isi.

function __cmp__($a, $b)
{
	$long  = explode('-', (count($a) >= count($b)) ? $a['idParte'] : $b['idParte']);
	$short = explode('-', (count($a) <  count($b)) ? $a['idParte'] : $b['idParte']);

foreach ($short as $k => $v)
	if ($v != $long[$k]) return (int)$long[$k] - (int)$v;

return 1;
}


usort($res, '__cmp__');

De otra manera podrías crear otra matriz paralela, de tal modo que cada índice tuviera sólo el texto que es criterio de ordenación, y ordenar esa matriz con lo de l0c0. Pero para ordenar la original, tendrías que leer las claves de la matriz paralela, y ordenar a partir de ahí... Me pareció más fácil lo que he hecho yo.

dit: Lo he probado y no funciona. Lo ordena 1, 2, 3, 4, 1-1, 1-2, 1-1-1...
Si hubiera funcionado se podría haber aplicado a mi codigo de arriba utilizando strnatcmp, y habría quedado muy reducido, lástima.

Esto no funciona bien
LOc0

#3

Oye, ¿estás seguro de que la función cmp hace lo que pretende #1? Es que después de ver el código he notado algo "raro", así que la he probado y resulta que ordena así:

1
1-1
1-1-12
1-1-1
1-1-11
1-1-10
1-1-2

Según he entendido en #1 debería quedar así:

1
1-1
1-1-1
1-1-2
1-1-10
1-1-11
1-1-12

Juas, ahora me tengo que ir a cenar (esto de la alimentación es un coñazo xD). Luego le echo un vistazo.

Salu2 ;)

PD: probado con natsort() a secas y va perfecto.

NeB1

increible lo del natsort!! buah, había creado una ultra función recursiva super rara,y que al final siempre se dejaba unos pocos por ordenar,. Me e pasado todo el día para que al final exista esto, bendito php que nos libra de pensar ^^

guner

No sé en qué estaría pensando ayer por la noche...

La primera funcion si que funciona. Saltan algunos warnings y notices porque las dos primeras lineas no tienen mucho sentido y no hacen lo que deben, no obstante ordena bien.

La segunda funcion, la del spoiler, resulta que si funciona pero ayer no sé que es lo que haría mal, pero esta mañana va bien. Total, viendo que el ordenamiento natural funciona, la función óptima que haría funcionar esto sería...

usort($res, create_function('$a,$b', 'return strnatcasecmp($a["idParte"],$b["idParte"]);'));

Usuarios habituales

  • guner
  • NeB1
  • LOc0