2011-10-08 13 views

Odpowiedz

0

Można użyć funkcji array_walk jak omówiono tutaj (3rd odpowiedź w dół): is it possible if callback in array_filter receive parameter?

+0

Zbyt trudne i pracuję z tablicami indeksowanymi, które nie są skojarzone. W tym rozwiązaniu klucze są zakodowane na stałe. – gremo

+1

Być może bardziej standardowa implementacja 'code'foreach ($ arr jako $ key => $ val) {} spełniłaby twoje potrzeby. – jondbaker

+0

Potrzebuję filtrować tablicę wejściową: jeśli klucz istnieje w innej tablicy, zwróć ten element. Znalazłem "array_filter" kandydata, ale nie mogę uzyskać klucza bieżącej wartości tablicy w wywołaniu zwrotnym. – gremo

7

W poprzednim komentarzu ty przedstawionym jesteś rzeczywiście patrząc na coś takiego:

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

Więc rzeczywiście usuń wszystkie wartości z tablicy $t, które nie mają klucza w tablicy $valid.

Funkcja PHP nazywa się array_intersect_key. Przecięcie jest równa przefiltrowanej wyniku:

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

Nie ma mowy, aby pozwolić oddzwanianie array_filter dostępu kluczowego elementu, ani czy istnieje podobna funkcja, która robi to, co chcesz.

Można jednak napisać własną funkcję do tego, jak poniżej:

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

mi się nie podoba inne opcje proponowane tutaj, jeśli ktoś szuka tej funkcji, jest tutaj szybka realizacja:

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

efektem tej funkcji jest dokładnie to, co brzmi jak, zwróci tablicę filtrowany przez funkcję zwrotną, która odbiera raczej klawiszy niż wartości.

EDYTOWANIE: Jest to bardziej zrzeczenie się, po przeczytaniu kilku innych komentarzy, zdaję sobie sprawę, że OP faktycznie szuka tylko array_intersect, jak wskazał hakre. Zostawię tę odpowiedź tutaj chociaż ponieważ kwestia PO nie wyraźnie stwierdzić, że potrzeby i ta strona pojawia się w Google dla array_filter_keys

9

Z dokumentacji: PHP 5.6.0 Dodano parametr opcjonalny flagi i stałe ARRAY_FILTER_USE_KEY i ARRAY_FILTER_USE_BOTH

Powiązane problemy