2010-08-11 17 views
6

Escribí esta función para obtener un subconjunto de una matriz. ¿Tiene php una función incorporada para esto? No puedo encontrar uno en los documentos. Parece una pérdida si estoy reinventando la rueda.Obtener un subconjunto de una matriz basada en una matriz de claves

function array_subset($array, $keys) { 
    $result = array(); 
    foreach($keys as $key){ 
     $result[$key] = $array[$key]; 
    } 
    return $result; 
} 
+0

Posible duplicado de [función de matriz de PHP que devuelve un subconjunto de claves dadas] (https://stackoverflow.com/questions/12543361/php-array-function-that-returns-a-subset-for-given-keys) –

Respuesta

10

array_diff_key y array_intersect_key son probablemente lo que quiere.

+1

Los nombres de las funciones son singulares. http://www.php.net/manual/en/ref.array.php ¡PHP necesita limpiar sus convenciones de nombres! – Keyo

+1

Cuando mapea claves en una matriz asociativa para buscar una tabla de valores en una matriz no asociativa, puede usar 'array_flip' en un argumento para asegurarse de que la intersección/diff se basa en ambas claves o en ambos valores, no una mezcla de uno o el otro. – danronmoon

4

Siempre quiero esto también. Al igual que una versión PHP de Underscore's pick.

Es feo y contrario a la intuición, pero lo que a veces hago es esto (creo que esto puede ser lo prodigitalson quería llegar):

$a = ['foo'=>'bar', 'zam'=>'baz', 'zoo'=>'doo']; 

// Extract foo and zoo but not zam 
print_r(array_intersect_key($a, array_flip(['foo', 'zoo']))); 
/* 
Array 
(
    [foo] => bar 
    [zoo] => doo 
) 
*/ 

array_intersect_key devuelve todos los elementos del primer argumento cuyas claves son presente en el segundo argumento (y todos los argumentos posteriores, si los hay). Pero, como compara las teclas con las teclas, uso array_flip por conveniencia. También podría haber usado ['foo' => null, 'zoo' => null], pero eso es aún más feo.

Cuestiones relacionadas