2011-02-28 19 views
11

¿Simple, me preguntaba si existe una forma clara y elocuente de devolver todos los valores de una matriz asociativa que no coinciden con una clave determinada?Devolver todos los elementos de la matriz excepto una clave determinada

$array = array('alpha' => 'apple', 'beta' => 'banana', 'gamma' => 'guava'); 

$alphaAndGamma = arrayExclude($array, array('alpha')); 
$onlyBeta  = arrayExclude($array, array('alpha', 'gamma')); 

function arrayExclude($array, Array $excludeKeys){ 
    foreach($array as $key => $value){ 
     if(!in_array($key, $excludeKeys)){ 
      $return[$key] = $value; 
     } 
    } 
    return $return; 
} 

Esto es lo que estoy (iba a ser), utilizando, sin embargo, ¿existen implementaciones más limpias, algo que había perdido en el manual tal vez?

+0

¿Es posible que tenga valores en $ excludeArray que no existen en la matriz por la que está iterando? – dmcnelis

Respuesta

20

Se podía unset el valor:

$alphaAndGamma = $array; 
unset($alphaAndGamma['alpha']); 

Editar: dejado más claro. Puede copiar una matriz asignándola a otra variable.

o en una función:

function arrayExclude($array, Array $excludeKeys){ 
    foreach($excludeKeys as $key){ 
     unset($array[$key]); 
    } 
    return $array; 
} 
+0

Gracias ** Felix Kling **; Sí, sin embargo eso modifica la matriz original. – Dan

+0

@TomcatExodus: Sí, pero puede asignar la matriz a otra variable antes y desarmar los valores de ésta. La asignación copia la matriz. –

+0

No quiero parecer quisquilloso, sin embargo, su solución 'desactivó' de la matriz fuente.El OP quiere que la matriz-sin-este-y-que-clave sea devuelta desde una función. +1 para la solución obvia, sin embargo. –

1
$alphaAndGamma = $array; 
unset($alphaAndGamma['alpha']); 

$onlyBeta = $array; 
unset($onlyBeta['alpha'], $onlyBeta['gamma']); 
8

Uso array_diff_key():

$array = array('alpha' => 'apple', 'beta' => 'banana', 'gamma' => 'guava'); 

$alphaAndGamma = array_diff_key($array, array('alpha'=>0)); 
$onlyBeta  = array_diff_key($array, array('alpha'=>0, 'gamma'=>0)); 

EDIT: Agregué => 0s.

+1

Tienes que crear la segunda matriz de forma diferente a continuación. Tienes que usar 'array_flip (array ('alpha'))'. Pero buen enfoque +1. Más elegante que el mío, pero considerando todas las funciones, no necesariamente más rápido ... pero eso tenía que ser probado. –

+0

@Felix Kling, tienes razón. – linepogl

+0

Ah, y una segunda observación: esto solo funcionará si todas las claves que deben ser desarmadas también están en la matriz. Pero no tenemos suficiente información sobre eso. –

1

Ha habido algunas discusiones sobre la velocidad al usar in_array. Por lo que he leído, incluido este comentario 1, usar isset es más rápido que in_array.

En ese caso, el código sería:

function arrayExclude($array, array $excludeKeys){ 

    $return = []; 

    foreach($array as $key => $value){ 
     if(!isset($excludeKeys[$key])){ 
      $return[$key] = $value; 
     } 
    } 
    return $return; 
} 

Eso sería un poco más rápido, y puede ayudar en el caso de que usted está necesitando para procesar grandes conjuntos de datos.

-2

array_diff_assoc podría ayudar. Así es decir, usted podría utilizar

$onlyBeta = array_diff_assoc($array, array('alpha', 'gamma')) 
+1

Lea de nuevo cómo funciona 'array_diff_assoc' ... –

+1

Sí, eso no funciona. – Dan

+0

Oh, cierto. Confundí las dos funciones (array_diff_assoc y array_diff_key). – frabala

6

Aunque, esta pregunta es demasiado viejo y hay varias respuestas están allí para esta pregunta, pero estoy publicando una solución que pueda ser útil a alguien.

Usted puede obtener los todos los elementos de la matriz de entrada proporcionada excepto las determinadas teclas que ha definido para excluir el uso de:

$result = array_diff_key($input, array_flip(["SomeKey1", "SomeKey2", "SomeKey3"])); 

Esto excluirá los elementos de la matriz que tienen $input teclas SomeKey1, SomeKey2 y SomeKey3 y vuelta todos los demás en la variable $result.

Cuestiones relacionadas