Ver Mensaje Individual
  #5 (permalink)  
Antiguo 07/06/2011, 15:08
Avatar de auttranadhie
auttranadhie
 
Fecha de Ingreso: noviembre-2008
Ubicación: Madrid (España)
Mensajes: 156
Antigüedad: 15 años, 5 meses
Puntos: 8
Respuesta: UTF-8 y asort()

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.
__________________
A. Uttranadhie