2011-10-25 127 views
49

這裏的交易是我有一個包含17個元素的數組。我想在一定時間內獲取我需要的元素,並將它們從數組中永久刪除。更好的方法來取消設置多個數組元素

下面的代碼:

$name = $post['name']; 
$email = $post['email']; 
$address = $post['address']; 
$telephone = $post['telephone']; 
$country = $post['country']; 

unset($post['name']); 
unset($post['email']); 
unset($post['address']); 
unset($post['telephone']); 
unset($post['country']); 

是代碼是醜陋的,沒必要抨擊。我如何讓這看起來更好?

回答

67

它看起來像函數extract()將是一個更好的工具,你想要做的事情(假設它是從數組中提取所有的鍵/值並將它們分配給與本地作用域中的鍵名稱相同的變量)。提取內容後,您可以取消設置整個$post,假設它不包含任何您想要的內容。

然而,真正回答你的問題,你可以創建你想要遍歷,明確你重置他們刪除和按鍵的排列...

$removeKeys = array('name', 'email'); 

foreach($removeKeys as $key) { 
    unset($arr[$key]); 
} 

...或者你可以指向變量到一個新的數組,其具有鍵除去...

$arr = array_diff_key($arr, array_flip($removeKeys)); 

...或通過所有陣列成員unset()的...

unset($arr['name'], $arr['email']); 
+4

[array_diff_key()](http:// php。net/manual/en/function.array-diff-key.php)是一個不錯的解決方案。以爲我會補充說,你可以使用[array_intersect_key()](http://php.net/manual/en/function.array-intersect-key.php)做相反的事情,只保留某些元素 – batfastad

+1

我與bbradley - array_diff_key是很好的解決方案 – Michael

2

我理解這個問題是舊的,但我認爲最佳的方式可能做到這一點:

$vars = array('name', 'email', 'address', 'phone'); /* needed variables */ 
foreach ($vars as $var) { 
    ${$var} = $_POST[$var]; /* create variable on-the-fly */ 
    unset($_POST[$var]); /* unset variable after use */ 
} 

現在,你可以使用$名稱,$電子郵件,...從任何地方;)

注意:extract()不安全,所以完全沒有問題!

32

還有另一種方法比上面的例子更好。 來源:http://php.net/manual/en/function.unset.php

而是循環徹底整個陣列和取消其所有按鍵,你可以取消它曾經像這樣:

示例陣列:

$array = array("key1", "key2", "key3"); 

對於整個數組:

unset($array); 

對於唯一的密鑰:

unset($array["key1"]); 

對於一個陣列中的多個按鍵:

unset($array["key1"], $array["key2"], $array["key3"] ....) and so on. 

我希望這可以幫助你在你的發展。

40

使用array_diff_key刪除

$remove = ['telephone', 'country']; 

array_diff_key($post, array_flip($remove)); 

,如果你想提供的密鑰,以保持數組你可以使用array_intersect_key。

+3

不明白爲什麼這種方法不被接受爲獲獎答案,因爲它實際上是一種魅力! –

+0

太棒了!好一個。我喜歡這個,而不是遍歷數組和未設置的元素。 – lifo

+0

智能解決方案! – MAZux

相關問題