取消多个数组元素的更好方法


82

这里的问题是我有一个包含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']);

是的,代码很丑陋,无需扑朔迷离。如何使它看起来更好?

Answers:


104

使用array_diff_key删除

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

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

如果要提供要保留的键数组,可以使用array_intersect_key。


6
不明白为什么这种方法不能作为成功的答案,因为它实际上是一种魅力!!
Alex

辉煌!好东西。我喜欢这样,而不是遍历数组和取消设置元素。
lifo

1
聪明的解决方案!
MAZux

灵巧,但对于大型输入阵列而言速度较慢。对于较大的输入数组和(至少)要设置的键数较少,foreach未设置似乎要快得多。
slepic '19

101

看来该功能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']);

8
array_diff_key()是一个不错的解决方案。以为我可以补充一点,您可以使用array_intersect_key()进行相反操作,仅保留某些元素
batfastad 2014年

1
我与bbradley在一起-array_diff_key是一个很好的解决方案
Michael

碰巧我只是在未设置foreach的情况下执行此操作。然后我认为可能会有更好的解决方案。Google带领我来到这里。因此,我尝试了array_diff_key,结果发现,对于大型输入数组,它比foreach慢得多(至少当要设置的键数相对较小时)。
slepic '19

46

还有另一种方法比上面的示例更好。资料来源: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.

希望这对您的发展有所帮助。


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 */
}

现在,您可以在任何地方使用$ name,$ email...。

注意:extract()不安全,因此完全没有问题!


出于好奇-为什么extract()不安全?
Srdjan Marjanovic


哦! 好一个!谢谢!
Srdjan Marjanovic
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.