首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >按值删除数组项

按值删除数组项
EN

Stack Overflow用户
提问于 2009-12-11 03:36:42
回答 10查看 170K关注 0票数 171

我需要删除具有给定值的数组项:

代码语言:javascript
复制
if (in_array($id, $items)) {
    $items = array_flip($items);
    unset($items[ $id ]);
    $items = array_flip($items);
}

可以用更短(更有效)的方式来完成吗?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-12-11 03:41:19

这样如何:

代码语言:javascript
复制
if (($key = array_search($id, $items)) !== false) unset($items[$key]);

或者对于多个值:

代码语言:javascript
复制
while(($key = array_search($id, $items)) !== false) {
    unset($items[$key]);
}

这也可以防止密钥丢失,这是array_flip()的副作用。

票数 31
EN

Stack Overflow用户

发布于 2012-02-14 06:12:03

它可以通过一个简单的一行代码来完成。

拥有这个数组:

代码语言:javascript
复制
$arr = array('nice_item', 'remove_me', 'another_liked_item', 'remove_me_also');

您可以执行以下操作:

代码语言:javascript
复制
$arr = array_diff($arr, array('remove_me', 'remove_me_also'));

$arr的值是:

代码语言:javascript
复制
array('nice_item', 'another_liked_item')
票数 426
EN

Stack Overflow用户

发布于 2009-12-11 04:01:23

我添加了第二个答案。我在这里编写了一个快速基准测试脚本来尝试各种方法。

代码语言:javascript
复制
$arr = array(0 => 123456);
for($i = 1; $i < 500000; $i++) {
    $arr[$i] = rand(0,PHP_INT_MAX);
}

shuffle($arr);
$arr2 = $arr;
$arr3 = $arr;

/** 
 * Method 1 - array_search()
 */
$start = microtime(true);
while(($key = array_search(123456,$arr)) !== false) {
    unset($arr[$key]);
}
echo count($arr). ' left, in '.(microtime(true) - $start).' seconds<BR>';

/** 
 * Method 2 - basic loop
 */
$start = microtime(true);
foreach($arr2 as $k => $v) {
    if ($v == 123456) {
        unset($arr2[$k]);
    }
}
echo count($arr2). 'left, in '.(microtime(true) - $start).' seconds<BR>';

/** 
 * Method 3 - array_keys() with search parameter
 */
$start = microtime(true);
$keys = array_keys($arr3,123456);
foreach($keys as $k) {
    unset($arr3[$k]);
}
echo count($arr3). 'left, in '.(microtime(true) - $start).' seconds<BR>';

第三种方法是指定了可选搜索参数的array_keys(),它似乎是目前为止最好的方法。输出示例:

代码语言:javascript
复制
499999 left, in 0.090957164764404 seconds
499999left, in 0.43156313896179 seconds
499999left, in 0.028877019882202 seconds

由此判断,我将使用的解决方案是:

代码语言:javascript
复制
$keysToRemove = array_keys($items,$id);
foreach($keysToRemove as $k) {
    unset($items[$k]);
}
票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1883421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档