Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: skatersezo en 15 de Febrero 2017, 16:58
-
Hola, tengo un problema que no lo logro resolver utilizando las funciones substring de PHP para extraer de una cadena entera de apellidos, los apellidos individuales por separado, voy a copiar el código:
Este es el HTML
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Prueba formulario PHP</title>
</head>
<body>
<h1>En éste formulario todos los campos son requeridos</h1>
<form action="formulario.php" method="post">
<fieldset> <!--etiqueta para agrupar elementos de un formulario-->
<p> <!-- definir un parrafo-->
<label for="nombre">Nombre: </label>
<input type="text" name="nombre" id="nombre">
<br/> <br/>
<label for="apellidos">Apellidos: </label>
<input type="text" name="apellidos" id="apellidos">
<br/> <br/>
<label for="birthdate">Fecha de nacimiento: </label>
<input type="date" name="birthdate">
<br/> <br/>
<label for="email">Email: </label>
<input type="text" name="email" id="email">
<br/> <br/>
<input type="radio" name="sexo" id="varon" value="Varón">
<label for="varon">Varón: </label>
<br/> <br/>
<input type="radio" name="sexo" id="mujer" value="Mujer">
<label for="mujer">Mujer: </label>
<br/> <br/>
<input type="submit" value="Enviar">
<input type="reset">
</p>
</fieldset>
</form>
</body>
</html>
Y este es el PHP:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Documento sin título</title>
</head>
<body>
<?php
$nombre = $_REQUEST['nombre'];
$apellidos = $_REQUEST['apellidos'];
$birthdate = $_REQUEST['birthdate'];
$email = $_REQUEST['email'];
$sexo = $_REQUEST['sexo'];
$apellido1="";
$apellido2="";
function ExtraeApellido1 ($apellidos) { //funcion para extraer el primer apellido
for ($i = 0; $i < $apellidos; $i++) {
if ($apellidos[i]==" "){ //si tiene más de un 1 apellido voy a buscar el espacio
$apellido1 = substr($apellidos, 0, $i); //extraigo con substring desde la posicion 0 del string apellidos hasta el espacio el primer apellido
}
}
return $apellido1;
}
function ExtraeApellido2 ($apellidos) { //funcion para extraer el segundo apellido
for ($i = 0; $i < $apellidos; $i++) {
if ($apellidos[i]==" "){ //si tiene más de un 1 apellido voy a buscar el espacio
$apellido2 = substr($apellidos, ($i+1)); //extraigo con substring desde la posicion del espacio +1 hasta el final el segundo apellido
}
}
return $apellido2;
}
function CalculaEdad( $fecha ) { //funcion para calcular edad a partir de una fecha date tipo yyyy-mm-dd
list($Y,$m,$d) = explode("-",$fecha);
return( date("md") < $m.$d ? date("Y")-$Y-1 : date("Y")-$Y );
}
$apellido1 = ExtraeApellido1($apellidos);
$apellido2 = ExtraeApellido2($apellidos);
$edad = CalculaEdad($birthdate);
echo "Tu nombre es " . $nombre . " y tu primer apellido es " . $apellido1 . " y tu segundo apellido " . $apellido2 . " y tienes " . $edad . " años.";
?>
</body>
</html>
El error me da al retornar el valor de las variables $apellido1 y $apellido2, parece ser que no retorna nada
-
Con apellidos tipo López Martín podrías usar strpos para encontrar la posición del espacio en blanco entre apellidos y luego substr para extraer directamente apellido1 y apellido2
<html>
<head>
<title>Extracion de apellidos</title>
</head>
<body>
<?php
//$apellidos="Gutierrez Ayala";
//$apellidos="Lopez Martin";
$apellidos="Goirigorreketechea Mentxakasubiroguea";
$posicion_espacio=strpos($apellidos, " ");
$longitud=strlen($apellidos);
$apellido1=substr($apellidos,0,$posicion_espacio);
$apellido2=substr($apellidos,$posicion_espacio+1,$longitud-$posicion_espacio);
echo "Longitud de los apellidos : " . $longitud . "<br>";
echo "Posición del espacio : " . $posicion_espacio . "<br>";
echo "Apellido1 : #" . $apellido1 . "#<br>";
echo "Apellido2 : #" . $apellido2 . "#";
?>
</body>
</html>
[code]
El problema son los apellidos compuestos: Lopez de la Huerta Martin de la Fragua ;D
-
Muchas gracias LoboBlanco, estoy deseando llegar a casa y probarlo, no conocía el método strpos. Con los apellidos compuestos me romperé la cabeza otro día, solo quería practicar las operaciones con cadenas.
-
Hola skatersezo.
Hay varias opciones para hacer esto, como te comentó LoboBlanco, pero primeramente deberías corregir tu código puesto que tienes algunos errores.
Para empezar, en esta línea:
for ($i = 0; $i < $apellidos; $i++) {
$apellidos contendrá un string, entonces tendrás que usar strlen($apellidos).
En la siguiente línea:
if ($apellidos[i]==" "){
Te faltaría el "$" en el índice de $apellidos.
También te podrías valer de la función "preg_split()", que usando una expresión regular te devuelve un array de strings:
$arrayApellidos = preg_split("/\s/", $apellidos);
O también de la función "explode()", que veo que usaste para otro fin también en tú código:
$arrayApellidos = explode(" ", $apellidos));
En cualquier caso, veo poco útil intentar saber cual es el primer apellido extrayéndolo de un string, porque ¿que pasa si el primer apellido es compuesto?
Pienso que sería mejor tener una caja de texto más en el formulario para que se introdujesen por separado los dos apellidos.
Saludos. ;D