高效删除 PHP 数组中多个元素的方法

15
我有一个动态生成的文件名数组,假设它看起来像这样:
$files = array("a-file","b-file","meta-file-1", "meta-file-2", "z-file");

我有几个具体的文件名,我想从数组中删除它们:

$exclude_file_1 = "meta-file-1";
$exclude_file_2 = "meta-file-2";

所以,我将始终知道要丢弃的元素的值,但不知道其键。

目前我正在考虑几种方法来实现这个目标。 其中一种方式是使用array_filter和自定义函数:

function excludefiles($v)
        {
        if ($v === $GLOBALS['exclude_file_1'] || $v === $GLOBALS['exclude_file_2'])
          {
          return false;
          }
        return true;
        }

$files = array_values(array_filter($files,"excludefiles"));

另一种方法是使用 array_keys和unset

$exclude_files_keys = array(array_search($exclude_file_1,$files),array_search($exclude_file_2,$files));
foreach ($exclude_files_keys as $exclude_files_key)
    {    
    unset($files[$exclude_files_key]);
    }
$files = array_values($page_file_paths);

两种方法都能得到所需的结果。

我只是想知道哪种方法更有效(以及为什么)?

或者也许还有另一种更有效的方法可以做到这一点?

比如可能有一种方法可以在array_search函数中使用多个搜索值?


嗨,Feanne - 一旦你找到了一个可接受的答案,就不需要更改标题。一旦你点击绿色的勾号,StackOverflow会处理所有这些问题 :) - Mike B
3个回答

33
你应该简单地使用 array_diff:
$files = array("a-file","b-file","meta-file-1", "meta-file-2", "z-file");
$exclude_file_1 = "meta-file-1";
$exclude_file_2 = "meta-file-2";

$exclude = array($exclude_file_1, $exclude_file_2);
$filtered = array_diff($files, $exclude);

PHP 的一个不好的地方是它有数不清的函数用来做特定的小事情,但有时这也可以变得很方便。

当你遇到像这样的情况(你找到了一个相关的函数解决了问题,但是你不确定是否有更好的方式),建议你在php.net的函数列表边栏上浏览。仅仅阅读函数名称就可能带来巨大的回报。


非常感谢@Jon - 我会记住你的建议。我确实会在闲暇时阅读函数列表,但从来没有太关注“diff”函数,因为我无法想象如何使用它们...现在我知道得更好了! :) - Feanne
如果那些元素不是字符串而是对象或者数组呢?我想删除那些具有某些属性等于'a'和'b'的元素,例如? - Herokiller
在这种情况下,您需要使用array_filter - Jon
2
类似的,如果你需要从一个关联数组中过滤掉特定的键:$filtered = array_diff_key($arrayToFilter, array_flip(['remove_key_1', 'remove_key_2'])); - John Rix

5

使用array_diff()函数

$files = array("a-file","b-file","meta-file-1", "meta-file-2", "z-file");
$exclude_file_array = array("meta-file-1", "meta-file-2");

将返回一个数组,其中包含$exclude_file_array中所有不在$files中的元素。
$new_array = array_diff($files, $exclude_file_array);

这比您自己编写的函数和循环更好。


谢谢,这已经被指出并且我已经在我的代码中实现了它。 - Feanne
欢迎 @Feanne,正如Jon所说的那样,先浏览一下php.net会很好...做得好。 - GoSmash

1

有另一种方法可以从php数组中删除多个元素。

而不是循环遍历整个数组并取消设置所有键,

您只需使用unset()方法销毁多个元素,如下所示:

示例:

$array = array("a-file","b-file","meta-file-1", "meta-file-2", "meta-file-3");

对于单个键:

unset($array["meta-file-1"]);

对于一个数组中的多个键:

unset($array["meta-file-1"], $array["meta-file-2"], $array["meta-file-3"] ....) and so on.

请参阅详细信息中的 unset()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接