除了给定的键之外,返回所有数组元素

42

很简单的问题,我只是想知道是否有一种干净而简洁的方法来返回与给定键不匹配的关联数组中的所有值?

$array = array('alpha' => 'apple', 'beta' => 'banana', 'gamma' => 'guava');

$alphaAndGamma = arrayExclude($array, array('alpha'));
$onlyBeta      = arrayExclude($array, array('alpha', 'gamma'));

function arrayExclude($array, Array $excludeKeys){
    foreach($array as $key => $value){
        if(!in_array($key, $excludeKeys)){
            $return[$key] = $value;
        }
    }
    return $return;
}

这是我(将要)使用的东西,但是否有更清晰的实现方法?也许我在手册中错过了什么?


дҪ жҳҜеҗҰеҸҜиғҪеңЁиҝӯд»Јзҡ„ж•°з»„дёӯдёҚеӯҳеңЁзҡ„$excludeArrayдёӯжӢҘжңүеҖјпјҹ - dmcnelis
1
在 Laravel 中,您可以使用 Arr::except($array , [ 'sdf' , 'sdf' ]) 或者如果是请求,则使用 $request->except([ 'sdf' , 'sdf' ])。 - saber tabatabaee yazdi
9个回答

60

虽然这个问题很旧,已经有几个答案了,但我还是发布一个解决方案,可能对某些人有用。

您可以使用以下方法从提供的输入中获取所有数组元素,除了您定义要排除的特定键:

$result = array_diff_key($input, array_flip(["SomeKey1", "SomeKey2", "SomeKey3"]));

这将从$input数组中排除键为SomeKey1SomeKey2SomeKey3的元素,并将所有其他元素返回到$result变量中。


3
整洁干净,简短甜美的回答。 - ManojKiran A

45
你可以直接使用unset函数来删除该值:
$alphaAndGamma = $array;
unset($alphaAndGamma['alpha']);

编辑:更加清晰明了。您可以通过将数组分配给另一个变量来复制数组。

或者在一个函数中:

function arrayExclude($array, Array $excludeKeys){
    foreach($excludeKeys as $key){
        unset($array[$key]);
    }
    return $array;
}

@Linus Kleen:复制一个数组很容易...尽管我使它更清晰了。 - Felix Kling
@dmcnelis;unset会抛出通知吗? - Dan Lugg
1
@TomcatExodus,@dmcnelis:刚刚测试了一下,不会抛出任何通知。因此,测试是不必要的。 - Felix Kling
@Felix Kling;谢谢!另外,我在我的库中应该将其称为arrayExclude还是array_exclude?只是想知道在您的经验中,在创建类似核心函数时是否最好遵守PHP的约定。 - Dan Lugg
@TomcatExodus:我会称其为array_exclude。但你真的应该看一下@linepogl的答案。结合array_flip,这是一个非常好的方法。 - Felix Kling
显示剩余7条评论

17

使用 array_diff_key()

$array = array('alpha' => 'apple', 'beta' => 'banana', 'gamma' => 'guava');

$alphaAndGamma = array_diff_key($array, array('alpha'=>0));
$onlyBeta      = array_diff_key($array, array('alpha'=>0, 'gamma'=>0));

编辑:我添加了=>0秒。


1
你必须用不同的方式创建第二个数组。你需要使用 array_flip(array('alpha'))。但你的方法很好 +1。比我的更优雅,但考虑到所有函数,并不一定更快...但这需要测试。 - Felix Kling
哦,还有第二个注意事项:只有在所有需要取消设置的键也在数组中时,此方法才有效。但我们对此没有足够的信息。 - Felix Kling
1
@Felix Kling。实际上,你是错的。请参考文档中的示例:http://www.php.net/manual/en/function.array-diff-key.php - linepogl
@linepogl:没错,有时候PHP函数的工作方式可能与它们的名称所表达的意思略有不同。如果可以的话,我会给你点赞两次的。 - Felix Kling
谢谢 linepogl;我得对这个和 Felix 的进行基准测试。 - Dan Lugg

13

如果你想使用Laravel的方式,Arr::except方法可以从数组中移除给定的键/值对:

use Illuminate\Support\Arr;

$array = ['name' => 'Desk', 'price' => 100];

$filtered = Arr::except($array, ['price']);

// ['name' => 'Desk']

@source https://laravel.com/docs/8.x/helpers#method-array-except

该方法从数组中排除指定的键。


3

这里有一个简单的函数,使用了两个数组:一个实际的数组和一个应该被排除的键名数组。如果我们排除函数的话,它也可以很容易地变成一行代码。

function array_except(array $array,array $except) {

 return array_filter($array,fn($key) => !in_array($key,$except),ARRAY_FILTER_USE_KEY);

}

2
$alphaAndGamma = $array;
unset($alphaAndGamma['alpha']);

$onlyBeta = $array;
unset($onlyBeta['alpha'], $onlyBeta['gamma']);

1
在使用in_array时,关于速度的讨论有一些。根据我所了解,包括这个评论1,使用isset比in_array更快。
那样的话,你的代码将是:
function arrayExclude($array, array $excludeKeys){

    $return = [];

    foreach($array as $key => $value){
        if(!isset($excludeKeys[$key])){
            $return[$key] = $value;
        }
    }
    return $return;
}

这样会稍微快一些,并且在需要处理大型数据集的情况下可能会有所帮助。


0

你可以轻松地通过其键名删除数组中的一个元素,使用以下代码:

unset($array['key']); 

演示 http://codepad.org/EA9vTwzR


-2

array_diff_assoc 可以帮助你。例如,你可以使用它来

$onlyBeta = array_diff_assoc($array, array('alpha', 'gamma'))

哦,对了。我混淆了两个函数(array_diff_assoc 和 array_diff_key)。 - frabala

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