domingo, 17 de agosto de 2008

Eliminar posiciones de arrays en PHP

Para eliminar un elemento de un array hay que tener en cuenta que es diferente según el tipo de array, y según queramos eliminar un elemento por su clave o por su valor.

Eliminar por clave en array NO asociativo

$miArrayNoAsociativo[0]="A";
$miArrayNoAsociativo[1]="B";
$miArrayNoAsociativo[2]="C";

unset($miArrayNoAsociativo[0]);
//He eliminado "A", resultado (1=>"B",2=>"C");

unset($miArrayNoAsociativo[2]);
//He eliminado "C", resultado (1=>"B");

//Normalizar el array
$miArrayNoAsociativo = array_values($miArrayNoAsociativo);
//resultado (0=>"B");

Otra opción es utilizar array_splice directamente con cada elemento a eliminar, que provoca la eliminación inmediata de la posición del array y su normalización. Para eliminar los mismos elementos en este caso, hacemos:

$miArrayNoAsociativo[0]="A";
$miArrayNoAsociativo[1]="B";
$miArrayNoAsociativo[2]="C";

//Indicamos el array de dónde eliminar, la posición,
// y el 1 es para que sólo elimine esa posición
array_splice($miArrayNoAsociativo, 0, 1);
//resultado (0=>"B",1=>"C");

array_splice($miArrayNoAsociativo, 1, 1);
//resultado (0=>"B");

Eliminar por clave en array asociativo

Para este tipo de arrays, utilizamos unset:

$miArrayAsociativo["a"]="A";
$miArrayAsociativo["b"]="B";
$miArrayAsociativo["c"]="C";

unset($miArrayAsociativo["a"]);
//He eliminado "A", resultado ("b"=>"B","c"=>"C");

unset($miArrayAsociativo["c"]);
//He eliminado "C", resultado ("b"=>"B");

Eliminar por valor en array NO asociativo

$miArrayNoAsociativo[0]="A";
$miArrayNoAsociativo[1]="B";
$miArrayNoAsociativo[2]="C";

$posicionAEliminar = array_search("B",$miArrayNoAsociativo,false);
array_splice($miArrayNoAsociativo, $posicionAEliminar, 1);
//resultado (0=>"A",1=>"C");

Eliminar por valor en array asociativo

$miArrayAsociativo["a"]="A";
$miArrayAsociativo["b"]="B";
$miArrayAsociativo["c"]="C";

$posicionAEliminar = array_search("B",$miArrayAsociativo,false);
array_splice($miArrayAsociativo, $posicionAEliminar, 1);
//resultado ("a"=>"A","c"=>"C");

sábado, 16 de agosto de 2008

Recuperar datos de formulario cuando la acción de envío detecta error en PHP

Es algo básico cuando programamos una web: los formularios y la gestión de errores de validación que pueden generar.
Supongamos que tenemos una página donde tenemos un formulario: formulario.php
Supongamos que tenemos un script que realiza la acción pretendida del formulario: action_formulario.php

Nuestro fomulario realiza el envío de datos al action, y éste, antes de nada, valida la corrección de los datos (los valores numéricos realmente lo son, si se pide un email, éste debe ser correcto, etc.) .

Tras la validación, el action redirigirá a otra página que mostrará el resultado de la operación, pero si no ha conseguido validar los datos, redirigirá al formulario para que el usuario vuelva a completarlo de manera correcta.
En este punto hay que tener en cuenta dos cosas: conviene informar al usuario de los errores cometidos, y por supuesto hay que dejarle el formulario con los mismos datos que introdujo para no tener que completar todo de nuevo.

Así pues, para hacer esto, utilizamos variables de sesión, tanto para el mensaje al usuario, como para pasar de nuevo los valores que el usuario introdujo:

fomulario.php

<?
$postAnterior = $_SESSION["POST_ANTERIOR"];
if (isset($_SESSION["mensajeAction"])){
echo "<div>".$_SESSION["mensajeAction"]."</div>";
unset($_SESSION[”mensajeAction”]);
}
?>
<form action="action_formulario.php" method="post">
<p>
<label for="nombre">
Nombre:
<input type="text" name="importe"
value="<?=$postAnterior["importe"]?>" />
</label>
</p>
</form>
<?unset($_SESSION["POST_ANTERIOR]);?>

action_formulario.php

//Validaciones
(...)
if ($error){
$_SESSION["mensajeAction"] =
"<p>El importe debe ser...</p>";
$_SESSION["POST_ANTERIOR"]= $_POST;
header("Location: fomulario.php");
exit;
}else{
//Acciones
(...)
$_SESSION["mensajeAction"] =
"<p>Ha introducido correctamente los datos y...</p>";
header("Location: paginaPrincipal.php");
exit;
}