Hola, de nuevo:
Efectivamente, iviamontes, quizás lo más adecuado es poner la solución para todos.
El planteamiento es el siguiente:
Se trata de una base de datos que contiene nombres y apellidos de autores literarios. Puesto que utilizo UTF-8 dichos valores (en formato
apellido, nombre) no se ordenaban bien alfabéticamente ya que los caracteres con tildes (acentuados gráficamente) u otros elementos aparecen siempre ordenados por detrás de los que no lo tienen.
Estos valores se guardan en una base de datos y se recuperan mediante consulta en una matriz cuyo índice es el ID de cada registro y el valor la concatenación de apellidos y nombre, junto con otros datos de interés (fechas, clarificadores, etc.)
La solución que encontré fue hacer uso del índice cada valor de matriz para no perder la referencia de cada valor y hacer que el mismo fuera reemplazado por uno igual pero sin caracteres acentuados, ordenar los registros adecuadamente y volver a rellenar cada valor de la matriz gracias al índice de la misma.
El código resultante ha sido el siguiente:
1.º Declaración de variables que contengan los caracteres a buscar:
Código PHP:
$pattern_a = '(á|à|â|ä|Á|À|Â|Ä)';
$pattern_e = '(é|è|ê|ë|É|È|Ê|Ë)';
$pattern_i = '(í|ì|î|ï|Í|Ì|Î|Ï)';
$pattern_o = '(ó|ò|ô|ö|Ó|Ò|Ô|Ö)';
$pattern_u = '(ú|ù|û|ü|Ú|Ù|Û|Ü)';
2.º Tras la consulta y varios procesos se rellena una primera matriz dentro del
while() de un
recordset: Código PHP:
$array_authority_unordered[$row_authority["authority_id"]] = $authority_name_main.$authority_name_sec.$authority_name_add.$authority_dtm;
3.º Por último, con la matriz obtenida, se crea una de tipo sesión (la voy a usar a lo largo de la misma) a partir de la primera y se reemplazan los valores no deseados por aquellos que me permitan una ordenación adecuada. Cuando termina, se ordena toda la matriz y se conmutan dentro de esa matriz ordenada los valores originales para que mantengan los caracteres acentuados:
Código PHP:
if (isset($array_authority_unordered)) // Por si la matriz no existiera
{
$_SESSION["authority"] = $array_authority_unordered;
foreach ($_SESSION["authority"] as $index => $value)
{
$value = preg_replace($pattern_a,"a", $value);
$value = preg_replace($pattern_e,"e", $value);
$value = preg_replace($pattern_i,"i", $value);
$value = preg_replace($pattern_o,"o", $value);
$value = preg_replace($pattern_u,"u", $value);
$_SESSION["authority"][$index] = $value;
}
asort($_SESSION["authority"]); // Ordenación de la matriz por sus valores
foreach ($_SESSION["authority"] as $index => $value)
{
foreach ($array_authority_unordered as $index_unordered => $value_unordered)
{
if ($index_unordered == $index)
{
$_SESSION["authority"][$index] = $value_unordered; // Conmutación del valor original por el que se ha utilizado para la ordenación
}
}
}
unset($array_authority_unordered);
}
No es que sea gran cosa, pero funciona. Ahora bien, si alguien puede aportar algo más simple e igualmente eficaz se agradecería muchísimo.
Espero que haya sido de ayuda para todos y un saludo.