2011-10-08 116 views

回答

0

您可以使用array_walk功能在這裏討論(第3回答下):is it possible if callback in array_filter receive parameter?

+0

太棘手了,我正在處理索引數組而不是關聯數組。在該解決方案中,密鑰是硬編碼的。 – gremo

+1

也許更標準的'code'foreach($ arr as $ key => $ val){}實現可以滿足您的需求。 – jondbaker

+0

我需要篩選輸入數組:如果其他數組中存在鍵,則返回該元素。我發現'array_filter'候選人,但我無法獲得當前數組值在回調中的關鍵。 – gremo

7

在你列出你實際上是在尋找這樣的事情之前的評論:

foreach ($t as $k => $v) 
    if (!array_key_exists($k, $valid)) 
     unset($t[$k]) 

所以實際上到刪除陣列$t中沒有數組$valid中的密鑰的所有值。

PHP的函數名爲array_intersect_key。交點等於過濾結果:

$filtered = array_intersect_key($t, $valid); 
3

有沒有辦法讓的array_filter訪問元素的關鍵回調,也沒有類似的功能,你想要做什麼。

但是,您可以編寫自己的功能對於這一點,像下面這樣:

function arrayfilter(array $array, callable $callback = null) { 
    if ($callback == null) { 
     $callback = function($key, $val) { 
      return (bool) $val; 
     }; 
    } 
    $return = array(); 
    foreach ($array as $key => $val) { 
     if ($callback($key, $val)) { 
      $return[$key] = $val; 
     } 
    } 
    return $return; 
} 

$test_array = array('foo', 'a' => 'the a', 'b' => 'the b', 11 => 1101, '', null, false, 0); 

$array = arrayfilter($test_array, function($key, $val) { 
    return is_string($key); 
}); 
print_r($array); 
/* 
Array 
(
    [a] => the a 
    [b] => the b 
) 
*/ 

$array = arrayfilter($test_array); 
print_r($array); 
/* 
Array 
(
    [0] => foo 
    [a] => the a 
    [b] => the b 
    [11] => 1101 
) 
*/ 
0

我不喜歡這裏提出的其他選項,如果其他人正在尋找此功能,這裏是一個快速實施:

function array_filter_keys($a, $c){ 
    $i=array_filter(array_keys($a), $c); 
    return array_intersect_key($a, array_flip($i)); 
} 

這個函數的結果正是這聽起來像,它將返回由接收鍵,而不是值的回調函數過濾數組。

編輯: 這是更多的免責聲明,在閱讀了一些其他評論後,我意識到OP實際上只是在尋找array_intersect正如hakre指出的那樣。我將在這裏離開這個答案雖然由於有機磷農藥的問題沒有明確規定,需要與該頁面顯示了在谷歌的array_filter_keys

9

從文檔: PHP 5.6.0增加了可選的標誌參數和常量ARRAY_FILTER_USE_KEY和ARRAY_FILTER_USE_BOTH