2011-02-28 43 views
11

简单的一个,我只是想知道是否有一个干净利落的方式来返回关联数组中不匹配给定键的所有值?返回给定键除外的所有数组元素

$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; 
} 

这是我使用(待会),但是,是否有清洁的实现,这是我也许手册中错过了什么?

+0

是否有可能在您正在迭代的数组中不存在$ excludeArray中的值? – dmcnelis 2011-02-28 21:41:00

回答

20

你可以只unset值:

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

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

或函数中:

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

感谢** Felix Kling **;是的,但是这会修改原始数组。 – Dan 2011-02-28 21:22:46

+0

@TomcatExodus:是的,但您可以先将数组赋值给其他变量,然后取消设置该数值。分配复制数组。 – 2011-02-28 21:23:33

+0

我不想听起来不错,但你的解决方案来自源数组。OP希望从函数返回数组,而不是这个和那个键。不过,对于显而易见的解决方案来说+1 – 2011-02-28 21:24:21

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

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

使用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)); 

编辑:我加了=> 0s。

+1

您必须以不同方式创建第二个数组。你必须使用'array_flip(array('alpha'))'。但好方法+1。比我更优雅,但考虑到所有功能,不一定更快......但需要测试。 – 2011-02-28 21:34:45

+0

@Felix Kling,你说得对。 – linepogl 2011-02-28 21:36:04

+0

哦,还有第二条评论:只有当所有必须取消设置的键都在数组中时,这才会起作用。但是我们没有足够的信息。 – 2011-02-28 21:43:32

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; 
} 

这将是稍快,并且在你需要处理大型数据集的情况下可能会有帮助。

-2

array_diff_assoc可以提供帮助。因此,即可以使用

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

再次阅读'array_diff_assoc'如何工作... – 2011-02-28 21:39:40

+1

是的,这是行不通的。 – Dan 2011-02-28 21:40:16

+0

哦,对。我混淆了两个函数(array_diff_assoc和array_diff_key)。 – frabala 2011-02-28 21:47:09

6

虽然,这个问题太旧,有几个答案是否有这个问题,但我张贴,可能是有用的人的解决方案。

你可能会从提供的输入的所有数组元素,除非你已经定义使用排除某些键:

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

这将排除$input阵列,具有键SomeKey1SomeKey2SomeKey3和返回的元素所有其他变成$result变量。

相关问题