Separar nombre completo PHP

En un archivo que mandaron venían nombres de personas en una única columna. Algo así:

Mario Andrés Cares Cabezas

Pero nosotros en la BD tenemos el nombre separado en 3 columnas.

Entonces, hice lo que cualquier programador haría … convertir el tema. Entonces, hice una función que haga la pega.

  1. Crear un array con las excepciones. Básicamente palabras claves en nombres compuestos: “Del Carmen”, “San Martín”, etc.
  2. Dividir el string inicial cortando por “espacios”. Invertirlo
  3. Iterar por cada trocito e ir rellenando un array con los campos.
  4. Indicar que el primer trocito que leamos tiene que ir en el apellido materno.
  5. Limpiar por si quedaron espacios en blanco.

En otras palabras, esto:

array_reverse(explode(" ", strtoupper($nombreCompleto)));
$exceptions = ["DE", "LA", "DEL", "LOS", "SAN", "SANTA"];
$nombre = array( "Materno" => "", "Paterno" => "", "Nombres" => "" );
$agregar_en = "materno";
foreach($chunks as $chunk){
    if($primera_vez){
        $nombre["Materno"] = $chunk . " " . $nombre["Materno"];
        $primera_vez = false;
    }else{
        if(in_array($chunk, $exceptions)){
            if($agregar_en == "materno")
                $nombre["Materno"] = $chunk . " " . $nombre["Materno"];
            elseif($agregar_en == "paterno")
                $nombre["Paterno"] = $chunk . " " . $nombre["Paterno"];
            else
                $nombre["Nombres"] = $chunk . " " . $nombre["Nombres"];
        }else{
            if($agregar_en == "materno"){
                $agregar_en = "paterno";
                $nombre["Paterno"] = $chunk . " " . $nombre["Paterno"];
            }elseif($agregar_en == "paterno"){
                $agregar_en = "nombres";
                $nombre["Nombres"] = $chunk . " " . $nombre["Nombres"];
            }else{
                $nombre["Nombres"] = $chunk . " " . $nombre["Nombres"];
            }
        }
    }
}
$nombre["Materno"] = trim($nombre["Materno"]);
$nombre["Paterno"] = trim($nombre["Paterno"]);
$nombre["Nombres"] = trim($nombre["Nombres"]);

Y eso era suficiente… obtenía algo así

Array
(
    [Materno] => Cabezas
    [Paterno] => Cares
    [Nombres] => Mario Andrés
)

Funciona como debería … el problema llegó cuando apareció un nombre con este formato:

Cares Cabezas Mario Andrés

Aquí tuve que cambiar el algoritmo de arriba:

  1. Agregar un parámetro a la función que me diga si el nombre viene dado vuelta o no. Como es un string, el script no tiene como saber si el trocito que viene es un nombre o un apellido, así que este parámetro es responsabilidad del usuario (o módulo) desde donde se llama a la función.
  2. En base a ese parámetro, si empieza por el apellido, entonces no invierto los trocitos.
  3. En vez de empezar rellenando el apellido Materno, empiezo por el Paterno.
  4. Si no lo invierto, tengo que invertir el orden de ingreso de trocitos a determinado campo. Entonces, primero reviso si alguno de los trocitos es parte de un apellido o nombre compuesto. En base a eso cambio el orden de ingreso.

Resumiendo, quedó así:

public static function getNombreSplit($nombreCompleto, $apellido_primero = false){
    $chunks = ($apellido_primero)
        ? explode(" ", strtoupper($nombreCompleto))
        : array_reverse(explode(" ", strtoupper($nombreCompleto)));
    $exceptions = ["DE", "LA", "DEL", "LOS", "SAN", "SANTA"];
    $existen = array_intersect($chunks, $exceptions);
    $nombre = array( "Materno" => "", "Paterno" => "", "Nombres" => "" );
    $agregar_en = ($apellido_primero)
        ? "paterno"
        : "materno";
    $primera_vez = true;
    if($apellido_primero){
        if(!empty($existen)){
            foreach ($chunks as $chunk) {
                if($primera_vez){
                    $nombre["Paterno"] = $nombre["Paterno"] . " " . $chunk;
                    $primera_vez = false;
                }else{
                    if(in_array($chunk, $exceptions)){
                        if($agregar_en == "paterno")
                            $nombre["Paterno"] = $nombre["Paterno"] . " " . $chunk;
                        elseif($agregar_en == "materno")
                            $nombre["Materno"] = $nombre["Materno"] . " " . $chunk;
                        else
                            $nombre["Nombres"] = $nombre["Nombres"] . " " . $chunk;
                    }else{
                        if($agregar_en == "paterno"){
                            $nombre["Paterno"] = $nombre["Paterno"] . " " . $chunk;
                            $agregar_en = "materno";
                        }elseif($agregar_en == "materno"){
                            $nombre["Materno"] = $nombre["Materno"] . " " . $chunk;
                            $agregar_en = "nombres";
                        }else{
                            $nombre["Nombres"] = $nombre["Nombres"] . " " . $chunk;
                        }
                    }
                }
            }
        }else{
            foreach ($chunks as $chunk) {
                if($primera_vez){
                    $nombre["Paterno"] = $nombre["Paterno"] . " " . $chunk;
                    $primera_vez = false;
                }else{
                    if(in_array($chunk, $exceptions)){
                        if($agregar_en == "paterno")
                            $nombre["Paterno"] = $nombre["Paterno"] . " " . $chunk;
                        elseif($agregar_en == "materno")
                            $nombre["Materno"] = $nombre["Materno"] . " " . $chunk;
                        else
                            $nombre["Nombres"] = $nombre["Nombres"] . " " . $chunk;
                    }else{
                        if($agregar_en == "paterno"){
                            $nombre["Materno"] = $nombre["Materno"] . " " . $chunk;
                            $agregar_en = "materno";
                        }elseif($agregar_en == "materno"){
                            $nombre["Nombres"] = $nombre["Nombres"] . " " . $chunk;
                            $agregar_en = "nombres";
                        }else{
                            $nombre["Nombres"] = $nombre["Nombres"] . " " . $chunk;
                        }
                    }
                }
            }
        }
    }else{
        foreach($chunks as $chunk){
            if($primera_vez){
                $nombre["Materno"] = $chunk . " " . $nombre["Materno"];
                $primera_vez = false;
            }else{
                if(in_array($chunk, $exceptions)){
                    if($agregar_en == "materno")
                        $nombre["Materno"] = $chunk . " " . $nombre["Materno"];
                    elseif($agregar_en == "paterno")
                        $nombre["Paterno"] = $chunk . " " . $nombre["Paterno"];
                    else
                        $nombre["Nombres"] = $chunk . " " . $nombre["Nombres"];
                }else{
                    if($agregar_en == "materno"){
                        $agregar_en = "paterno";
                        $nombre["Paterno"] = $chunk . " " . $nombre["Paterno"];
                    }elseif($agregar_en == "paterno"){
                        $agregar_en = "nombres";
                        $nombre["Nombres"] = $chunk . " " . $nombre["Nombres"];
                    }else{
                        $nombre["Nombres"] = $chunk . " " . $nombre["Nombres"];
                    }
                }
            }
        }
    }
    // LIMPIEZA DE ESPACIOS
    $nombre["Materno"] = trim($nombre["Materno"]);
    $nombre["Paterno"] = trim($nombre["Paterno"]);
    $nombre["Nombres"] = trim($nombre["Nombres"]);
    return $nombre;
}

El problema, ahora, es que muchas partes se repiten … y no me gusta como se ve😯 … pero por apuro, se queda así.

Acerca de MaritoCares

Ingeniero Informático. Con tendencias a la programación en [C#, VB].NET, Java(Web principalmente...), PHP, JavaScript, algo mínimo de [ruby, python], y el clásico C.
Esta entrada fue publicada en Uncategorized. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s