Convertir una cadena UTF-8 en un array en PHP

Mientras llega y no llega PHP 6, con esas mejoras entre las que se encuentra el soporte nativo de UTF-8, algunos tenemos que seguir programando.

Creo que próximamente compartiré la clase de manejo de cadenas que estoy desarrollando, y que soporta 100% utf-8.

De momento voy a compartir una función, que si bien no es la más aconsejable puesto que los arrays en PHP consumen MUCHOS recursos, creo que facilita el uso de cadenas UTF-8, pues se les puede dar el mismo tratamiento que a una cadena normal.

Convertir una cadena UTF-8 a un array tiene 2 grandes ventajas:

  • cada elemento del array representa un único caracter
  • count sobre el array será equivalente a mb_strlen sobre la cadena

La gran destventaja son los tiempos de conversión y el consumo de memoria, al estar usando un array.

Ayer básicamente programé 2 funciones y cojí prestado un ejemplo que había puesto un usuario en la documentación de PHP.

Las tres versiones de estas funciones las podeis ver a continuación:

function getCharArray1 ($jstring)
{
  $len = mb_strlen ($jstring, 'UTF-8');
  if (mb_strlen ($jstring, 'UTF-8') == 0)
    return array();
 
  $ret = array();
  for ($i = 0; $i < $len; $i++) {
    $char = mb_substr ($jstring, $i, 1, 'UTF-8');
    array_push ($ret, $char);
  }
 
  return $ret;
}
 
// code from: http://uk3.php.net/manual/en/function.mb-split.php#80046
function getCharArray2 ($jstring)
{
  $len = mb_strlen ($jstring, 'UTF-8');
  if (mb_strlen ($jstring, 'UTF-8') == 0)
    return array();
 
  while ($len) {
    $ret[]  = mb_substr($jstring,0,1,"UTF-8");
    $jstring = mb_substr($jstring,1,$len,"UTF-8");
    $len = mb_strlen($jstring);
  }
  return $ret;
}
 
// using mb_check_encoding instead of mb_substr ;)
function getCharArray3 ($jstring)
{
  if (mb_strlen ($jstring, 'UTF-8') == 0)
    return array();
 
  $ret  = array ();
  $alen = strlen ($jstring);
  $char = '';
  for ($i = 0; $i < $alen; $i++) {
    $char .= $jstring[$i];
    if (mb_check_encoding ($char, 'UTF-8')) {
      array_push ($ret, $char);
      $char = '';
    }
  }
 
  return $ret;
}

La función más rápida es la última, que utiliza un pequeño truco que se me ocurrió.

La gráfica representa los tiempos de ejecución de cada una de estas funciones para una serie de iteraciones sobre una cadena notablemente larga.


Leyenda:

  • getCharArray1: en rojo
  • getCharArray2: en verde
  • getCharArray3: en azul

Como se puede comprobar, getCharArray3 es la más rápida (sobre 4x más que getCharArray1 y 6x más que getCharArray2).

Finalmente, aquí teneis el enlace al script de benchmark que he usado para obtener esa gráfica.

Trackback URL

, , ,

73 Comments on "Convertir una cadena UTF-8 en un array en PHP"

  1. Jose Luis Anaya
    22/02/2009 at 5:42 pm Permalink

    La grafica esta hecha con Open Flash 2!!
    Excelentes graficas, yo las he empezado a utilizar hace menos de 3 meses con Jquery y he obtenido unas graficas muy dinamicas :) !

  2. Pau Sanchez
    23/02/2009 at 2:43 am Permalink

    Sabia yo que tenía que poner gráfica :)

    La verdad es que John Glazebrook se lo ha currado a base de bien.

  3. Steve
    25/03/2009 at 3:15 pm Permalink

    Thank you!! That was very, very helpful.

  4. Pau Sanchez
    26/03/2009 at 12:57 am Permalink

    You are welcome ;)

  5. Francesco
    23/04/2009 at 5:31 am Permalink

    This was very helpful Pau, thanks a lot.

    The last function is ingenious, really appreciated it. I will use it instead of the classic mb_substr.

  6. Pau Sanchez
    25/04/2009 at 11:25 am Permalink

    You are welcome Francesco.

    Although these functions are helpful one has to be aware they consume a huge amount of memory ;)

Hi Stranger, leave a comment:

ALLOWED XHTML TAGS:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

Subscribe to Comments