使用array_diff优雅的删除数组中指定的value值

在开发过程中经常需要删除数组中某个值;
比如说有个数组;

$names = [
    '张三',
    '李四',
    '王麻子'
]

我们希望删除 李四 这个值;
常规的思路是先用 array_search 函数获取 李四$names 中的键名;
然后使用 unset 删除;
为了严谨还得判断李四是否存在;

$key = array_search('李四', $names);
if ($key !== false) {
    unset($names[$key]);
}

这里有个坑是为了避免要删除的值在数组第0个位置的时候;
此处不能使用 if($key) 来判断;
而是应该使用if ($key !== false) ;
另外unset 不会重新格式化数组的key ;
操作完后会是这个样子的;

这个0和2少了1很是难受;
上面这两种操作中我们还可以用 array_splice 替代 unset

if ($key !== false) {
    array_splice($names, $key, 1);
}

而且一旦数组中有多个李四

$names = [
    '张三',
    '李四',
    '王麻子',
    '李四'
];

那上面这种方式还只能删除第一个李四;
如果要删除全部的李四就需要循环了;

foreach ($names as $k => $v) {
    if ($v === '李四') {
        unset($names[$k]);
    }
}

除了上面这些常规操作;
还有一个骚操作是利用 array_flip 两次反转数组;

$names = [
    '张三',
    '李四',
    '王麻子',
    '李四',
];
$names = array_flip($names);
unset($names['李四']);
$names = array_flip($names);

罢特如果王麻子也有两个的话;
因为键名不能重复的原因;
这种操作后只会保留1个王麻子;
因此这种方式不够完美;
文章磨磨唧唧终于算是讲到了最后;
拿出了标题中的array_diff
array_diff 本来是用来计算数组的差集;
8过根据我们小学学过的知识扩展下;
这个求差集可以用来删除数组指定的值;
如果忘了差集的概念;
现在可以翻开小学数学课本三年级上册《集合》复习下了;

$names = [
    '张三',
    '李四',
    '王麻子',
    '李四',
];
$names = array_diff($names, ['李四']);

array_diffunset 一样并不会格式化键名;
如果需要格式化键名;
就再加个 array_value

$names = [
    '张三',
    '李四',
    '王麻子',
    '李四',
];
$names = array_values(array_diff($names, ['李四']));

白俊遥博客
请先登录后发表评论
  • latest comments
  • 总共10条评论
白俊遥博客

٩(•̮̮̃•̃)─═SMAIL╄→ :6666666666白俊遥博客

2019-02-19 15:57:59 回复

白俊遥博客

明媚的早晨 :$names = array_merge(array_diff($names, ['李四'])); //这样写也可以格式化键名

2018-12-21 16:08:07 回复

白俊遥博客

xchenhao :array_reduce($names, function ($ret, $item) {    if ($item !== '李四') {       $ret[] = $item;    }    return $ret;}, []);

2018-12-21 00:00:36 回复

白俊遥博客

高清煌 :学到了。最后的array_value少了个s   array_values

2018-12-19 10:21:11 回复

白俊遥博客 白俊遥博客

云淡风晴 :多谢反馈;改过来了;

2018-12-19 10:22:21 回复

白俊遥博客

流年···陌路 白俊遥博客

2019-01-02 15:29:23 回复

白俊遥博客

流年···陌路 :请先登录后回复评论

2019-01-03 11:14:15 回复

白俊遥博客

遗忘つ 白俊遥博客

2019-03-04 15:47:43 回复

白俊遥博客

关元 :这操作666

2018-12-17 15:17:24 回复

白俊遥博客

叮叮咚咚叮叮咚 白俊遥博客

2018-12-17 10:27:38 回复