2010-02-09 20 views
41

tengo código PHP que se utiliza para agregar variables para una sesión:¿Cómo eliminar una variable de una matriz sesión de PHP

<?php 
    session_start(); 
    if(isset($_GET['name'])) 
    { 
     $name = isset($_SESSION['name']) ? $_SESSION['name'] : array(); 
     $name[] = $_GET['name']; 
     $_SESSION['name'] = $name; 
    } 
    if (isset($_POST['remove'])) 
    { 
     unset($_SESSION['name']); 
    } 
?> 
<pre> <?php print_r($_SESSION); ?> </pre> 

<form name="input" action="index.php?name=<?php echo $list ?>" method="post"> 
    <input type="submit" name ="add"value="Add" /> 
</form> 

<form name="input" action="index.php?name=<?php echo $list2 ?>" method="post"> 
    <input type="submit" name="remove" value="Remove" /> 
</form> 

Quiero eliminar la variable que se muestra en $list2 de la matriz de sesión cuando el usuario elige 'Eliminar'.

Pero cuando desactivo, TODAS las variables de la matriz se eliminan.

¿Cómo puedo eliminar solo una variable?

+1

no se puede código HTML dentro de un archivo PHP sin llamar echo' de antemano, es decir. echo '

'' –

+3

@Anthony puede si no está dentro de las etiquetas . – GSto

+0

D'oh! No vi que no era * (palma en la frente) * –

Respuesta

46
if (isset($_POST['remove'])) { 
    $key=array_search($_GET['name'],$_SESSION['name']); 
    if($key!==false) 
    unset($_SESSION['name'][$key]); 
    $_SESSION["name"] = array_values($_SESSION["name"]); 
} 

Desde $_SESSION['name'] es una matriz, es necesario encontrar la clave de matriz que apunta en el valor del nombre que le interesa. La última línea reorganiza el índice de la matriz para el siguiente uso .

39

Para eliminar una variable específica de la utilización de sesión:

session_unregister('variableName'); 

(see documentation) o

unset($_SESSION['variableName']); 

NOTA: session_unregister() ha dejado de utilizarse a partir de PHP 5.3.0 y retirado como se de PHP 5.4.0.

+0

se cae todos los valores de la matriz, no individuales :( – LiveEn

+0

Si la variable que está tratando de "soltar"/"unset" es una matriz, entonces la matriz se eliminará, por ejemplo, $ _SESSION ['myarray'] = array ('clave' => val, 'clave2' => val2); usnet ($ _ SESIÓN ['myarray'] desarmará la matriz ... pero unset ($ _ SESSION ['myarray'] ['key2'] eliminará el segundo elemento de matriz - (clave, valor) par – Andreas

+3

session_unregister() "Esta función ha sido DEPURADA a partir de PHP 5.3.0 y REMOVIDA a partir de PHP 5.4.0. " – Lamy

0

Intente éste:

if(FALSE !== ($key = array_search($_GET['name'],$_SESSION['name']))) 
{ 
    unset($_SESSION['name'][$key]); 
} 
1

Actualmente se están limpiando la matriz nombre, es necesario llamar a la matriz, entonces el índice que desea desarmar dentro de la matriz:

$ar[0]==2 
$ar[1]==7 
$ar[2]==9 

unset ($ar[2]) 

Dos formas de deshacer valores dentro de una matriz:

<?php 
# remove by key: 
function array_remove_key() 
{ 
    $args = func_get_args(); 
    return array_diff_key($args[0],array_flip(array_slice($args,1))); 
} 
# remove by value: 
function array_remove_value() 
{ 
    $args = func_get_args(); 
    return array_diff($args[0],array_slice($args,1)); 
} 

$fruit_inventory = array(
    'apples' => 52, 
    'bananas' => 78, 
    'peaches' => 'out of season', 
    'pears' => 'out of season', 
    'oranges' => 'no longer sold', 
    'carrots' => 15, 
    'beets' => 15, 
); 

echo "<pre>Original Array:\n", 
    print_r($fruit_inventory,TRUE), 
    '</pre>'; 

# For example, beets and carrots are not fruits... 
$fruit_inventory = array_remove_key($fruit_inventory, 
            "beets", 
            "carrots"); 
echo "<pre>Array after key removal:\n", 
    print_r($fruit_inventory,TRUE), 
    '</pre>'; 

# Let's also remove 'out of season' and 'no longer sold' fruit... 
$fruit_inventory = array_remove_value($fruit_inventory, 
             "out of season", 
             "no longer sold"); 
echo "<pre>Array after value removal:\n", 
    print_r($fruit_inventory,TRUE), 
    '</pre>'; 
?> 

Por lo tanto, unset no tiene efecto en el contador interno de la matriz.

http://us.php.net/unset

4

¿La variable $ _SESSION ['name'] es una matriz? Si desea eliminar una clave específica dentro de una matriz, debe referirse a esa clave exacta en la llamada a unset(); de lo contrario, eliminará toda la matriz, p.

$name = array(0 => 'a', 1 => 'b', 2 => 'c'); 
unset($name); // deletes the entire array 
unset($name[1]); // deletes only the 'b' entry 

Otro problema menor con su fragmento: Está mezclando los parámetros de consulta GET con un formulario POST. ¿Hay alguna razón por la cual no puedes hacer los formularios con el 'nombre' pasado en un campo oculto? Lo mejor es no mezclar las variables get y post, especialmente si usa $ _REQUEST en otro lugar. Puede encontrarse con todo tipo de diversión tratando de descubrir por qué $ _GET ['name'] no aparece igual que $ _POST ['name'], porque el servidor tiene una orden diferente de EGPCS establecida en el 'variables_order' Ajuste de .ini

<form blah blah blah method="post"> 
    <input type="hidden" name="name" value="<?= htmlspecialchars($list1) ?>" /> 
    <input type="submit" name="add" value="Add /> 
</form> 

Y tenga en cuenta la llamada htmlspecialchars().Si $ lista1 o $ lista2 contienen comillas dobles ("), que va a romper el código HTML

1

Si desea eliminar o no se ha establecido todos los $ _SESSION 's entonces prueba este

session_destroy(); 

Si desea eliminar específica $ _SESSION [ 'nombre'] entonces prueba este

session_unset('name'); 
Cuestiones relacionadas