2009-02-20 11 views
12

Voglio fare qualcosa apparentemente molto semplice, ma non riesco a trovare nulla a riguardo: basta estrarre un sottoinsieme di un array simile a array_splice, ma usando le chiavi per recuperare i valori:Estrazione di un sottoinsieme di valori da un array associativo (php)

$data = array('personName' => 'John', 'personAge' => 99, 'personId' => 1, 
       /* many more data I don't need here ... */); 

list($name, $age, $id) = array_splice_by_keys($data, 
          array('personName', 'personAge', 'personId'); 

Se tutto il resto fallisce, non c'è una funzione built-in per filtrare un array associativo con i tasti? Ad esempio:

$ filteredArray = array__extract__keys__and__values ​​($ srcArray, $ arrayOfWantedKeys);

// create a new array with ONLY those key => values I need 
$wanted_values = array_extract_keys_and_values($data, 
        array('personName', 'personAge', 'personId'); 

echo $wanted_values['personName']; 

Credo che la ragione per cui voglio fare il primo, è che non mi piace ripetere l'accesso array associativo tutto il mio codice, sembrerebbe meglio ottimizzato per copiare i valori che vengono utilizzati un sacco (in un ciclo per esempio), in una variabile locale, in più è molto più facile digitare $ name di $ somearray ['nome'].

EDIT: Grazie, credo che per l'utilizzo con la lista, la soluzione sarebbe

list($x, $y, $z) = array_values(array_intersect_key($array, array_flip($wantedKeys))); 

Intesresting uso di array_flip!

risposta

7

nella versione di PHP> = 5.1.0 è possibile utilizzare array_intersect_key:

$data = array('personName' => 'John', 'personAge' => 99, 'personId' => 1, 
      'test' => 23); 
$ex = array('personName'=>0, 'personAge'=>0, 'personId'=>0); 
var_dump(array_intersect_key($data, $ex)); 

valori in $ex non importa, devono solo essere presenti.

27

Questa è essenzialmente la stessa risposta di SilentGhost ma potrebbe essere più semplice e probabilmente un po 'più lenta.

array_intersect_key($array, array_flip($wantedKeys)); 
Problemi correlati