2011-02-28 46 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變量。

相關問題