2011-10-08 16 views

risposta

0

È possibile utilizzare la funzione array_walk come discusso qui (3 ° risposta verso il basso): is it possible if callback in array_filter receive parameter?

+0

Troppo difficile, e sto lavorando con gli array indicizzati non quelli associativi. In quella soluzione le chiavi sono hardcoded. – gremo

+1

Forse un'implementazione standard 'code'foreach ($ arr as $ key => $ val) {} potrebbe soddisfare le tue esigenze. – jondbaker

+0

Devo filtrare l'array di input: se la chiave esiste in un altro array, restituire l'elemento. Ho trovato 'array_filter' il candidato ma non riesco a ottenere la chiave del valore corrente dell'array in callback. – gremo

7

In un commento precedente profilassi si sta effettivamente alla ricerca di qualcosa di simile:

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

Quindi, in realtà a rimuovere tutti i valori dall'array $t che non dispongono di una chiave nell'array $valid.

La funzione PHP è denominata array_intersect_key. L'intersezione è pari al risultato filtrato:

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

Non c'è un modo per lasciare che il callback di array_filter chiave di accesso dell'elemento, né v'è una funzione simile che fa quello che si vuole.

Tuttavia, è possibile scrivere la propria funzione per questo, come quella qui sotto:

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

non mi piacciono le altre opzioni suggerite qui, se qualcun altro è alla ricerca di questa funzione, ecco un pratica attuazione:

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

Il risultato di questa funzione è esattamente quello che sembra, restituirà un array filtrato da una funzione di callback che riceve i tasti anziché i valori.

EDIT: Questo è più di un disclaimer, dopo aver letto alcuni degli altri commenti mi rendo conto che l'OP è in realtà solo in cerca di array_intersect come hakre sottolineato. Lascerò questa risposta qui però in quanto la questione PO non chiaramente che bisogno e la pagina si presenta in google per array_filter_keys

9

Dalla documentazione: PHP 5.6.0 Aggiunto il parametro facoltativo flag e costanti ARRAY_FILTER_USE_KEY e ARRAY_FILTER_USE_BOTH

Problemi correlati