2012-06-05 7 views
8

Podczas używania PHP, znajdę sobie pisanie kodu takich jak to dużo:Jak usunąć klucz i zwrócić wartość z tablicy PHP?

$target = $_SESSION[AFTER_LOGIN_TARGET]; 
unset($_SESSION[AFTER_LOGIN_TARGET]); 
return $target; 

W Pythonie istnieje dict.pop metoda, która pozwoli mi zrobić coś podobnego w jednej instrukcji, bez czasowego zmiennej:

return session.pop(AFTER_LOGIN_TARGET) 

Czy istnieje podobna funkcja lub sztuczka w PHP?

+1

Tak, usuwa użycia array_pop PHP/zawsze zwraca ostatni element ... – Sebas

+0

@Sebas ale to nie to, co znajduje się Pythona Funkcja 'dict.pop()' działa i jest bezużyteczna w opisanym przypadku: – lanzz

+0

Wiem, to właśnie powiedziałem. – Sebas

Odpowiedz

8

Nie widzę wbudowanej funkcji do tego, ale można łatwo tworzyć własne.

/** 
* Removes an item from the array and returns its value. 
* 
* @param array $arr The input array 
* @param $key The key pointing to the desired value 
* @return The value mapped to $key or null if none 
*/ 
function array_remove(array &$arr, $key) { 
    if (array_key_exists($key, $arr)) { 
     $val = $arr[$key]; 
     unset($arr[$key]); 

     return $val; 
    } 

    return null; 
} 

Można go używać z dowolną tablicą, np. $_SESSION:

return array_remove($_SESSION, 'AFTER_LOGIN_TARGET'); 
+0

'isset' byłoby wystarczające. – Eugene

+0

@Eugene - 'isset' zwróci' false', jeśli wartość wynosi 'null', powodując, że funkcja opuści wpis w tablicy. –

+0

Mówiłem o 'array_key_exists'. 'isset' wystarczyłoby. – Eugene

1

Dlaczego funkcja pomocnika? Coś takiego:

function getAndRemoveFromSession ($varName) { 
    $var = $_SESSION[$varName]; 
    unset($_SESSION[$varName]); 

    return $var; 
} 

Więc jeśli zadzwonisz

$myVar = getAndRemoveFromSession ("AFTER_LOGIN_TARGET"); 

masz co prosiłeś (spróbuj go trochę, że nie zostały wykorzystane php wiele razy: -])

+0

'getAndRemoveFromSession'? – Eugene

+0

Tak, zmieniłem nazwę na –

0

myślę, czego szukasz jest array_slice()

$target = array_slice(
    $_SESSION, 
    array_search('AFTER_LOGIN_TARGET', $_SESSION), 
    1 
);