Supongamos que tengo este array asociativo, cuyas keys son tres valores separados por comas, y cuyos valores son simples integers:
Código PHP:
Array
(
[221,79,75] => 3344
[162,50,40] => 533
[213,63,53] => 30
[87,58,24] => 1073
[79,45,62] => 1963
[143,89,7] => 120
[208,100,18] => 29
[31,36,86] => 104
[165,2,100] => 70
[35,70,38] => 82
[34,100,15] => 27
[145,20,61] => 2
[25,56,60] => 3
[264,26,38] => 1
[327,14,31] => 2
[12,27,15] => 1
)
Código PHP:
function criterio($a,$b) {
$ha = explode(",",$a);
$ha = (int) $ha[0];
$hb = explode(",",$b);
$hb = (int) $hb[0];
return ($ha<$hb)? -1 : ( ($ha==$hb)?0:1 );
}
uksort($miArray, "criterio");
Código PHP:
Array
(
[12,27,15] => 1
[25,56,60] => 3
[31,36,86] => 104
[34,100,15] => 27
[35,70,38] => 82
[79,45,62] => 1963
[87,58,24] => 1073
[143,89,7] => 120
[145,20,61] => 2
[162,50,40] => 533
[165,2,100] => 70
[208,100,18] => 29
[213,63,53] => 30
[221,79,75] => 3344
[264,26,38] => 1
[327,14,31] => 2
)
La duda viene ahora. Supongamos que, teniendo esta ordenación, quiero sub-ordenarla según la segunda columna del key, algo así como una cláusula order by múltiple de SQL. Ahora me diréis que no se puede porque no hay valores iguales en la primera columna, pero yo quiero considerar que son valores iguales todos los que distan entre sí una distancia $d, pongamos que $d=30.
Entonces encontramos en nuestro array varios "grupos" según esa $d:
Código PHP:
// primer grupo, media de la primera columna = 27,4 ~ 27
[12,27,15] => 1
[25,56,60] => 3
[31,36,86] => 104
[34,100,15] => 27
[35,70,38] => 82
// segundo grupo, media = 83
[79,45,62] => 1963
[87,58,24] => 1073
// tercer grupo, media = 153,75 ~ 154
[143,89,7] => 120
[145,20,61] => 2
[162,50,40] => 533
[165,2,100] => 70
// cuarto grupo, media = 214
[208,100,18] => 29
[213,63,53] => 30
[221,79,75] => 3344
// quinto grupo, media = 264
[264,26,38] => 1
// sexto grupo, media = 327
[327,14,31] => 2
Código PHP:
Array
(
[27,27,15] => 1
[27,56,60] => 3
[27,36,86] => 104
[27,100,15] => 27
[27,70,38] => 82
[83,45,62] => 1963
[83,58,24] => 1073
[154,89,7] => 120
[154,20,61] => 2
[154,50,40] => 533
[154,2,100] => 70
[214,100,18] => 29
[214,63,53] => 30
[214,79,75] => 3344
[264,26,38] => 1
[327,14,31] => 2
)
Código PHP:
Array
(
[27,27,15] => 1
[27,36,86] => 104
[27,56,60] => 3
[27,70,38] => 82
[27,100,15] => 27
[83,45,62] => 1963
[83,58,24] => 1073
[154,2,100] => 70
[154,20,61] => 2
[154,50,40] => 533
[154,89,7] => 120
[214,63,53] => 30
[214,79,75] => 3344
[214,100,18] => 29
[264,26,38] => 1
[327,14,31] => 2
)
Bueno, incluso podríamos hacer lo mismo recursivamente para la tercera columna etc, pero los grupos son tan reducidos en elementos que ya ni me interesa. A todo este proceso supongo que no debo decir que no puedo perder las keys del array original (en estos ultimos ejemplos las he machacado)
La cuestión en sí: Ordenar el array según un criterio que lo ordene de menor a mayor en la primera columna, y después agrupar ciertos valores del array según una variable $d (definir el algoritmo) para reordenar los sub-grupos restantes según la segunda columna de menor a mayor también.
Espero que se me entienda, estoy totalmente perdido y no he podido ni intentar nada al respecto