2010-11-07 1232 views
13

Mi sistema de envío de un paquete de configuración para una función como esta:Un elemento condicional dentro de un array (...) construir

callThatFunction(array(k1 => v1, k2 => v2, ... kn=vn)); 

Quiero hacer uno de los pares de valores clave, condicionada a algunas circunstancias.

¿Puedo hacer esto sin crear una variable para la matriz (y esto rompiendo la sintaxis de configuración limpia que alguien más había creado)?

gusta esta

callThatFunction (array(
k1 => v1, 
if($cond({k2 => v2,} 
... 
kn=vn)); 

Lo anterior es obviamente incorrecto sintácticamente, sino que debe expresar mi idea.

Gracias

Respuesta

1

Finalmente se me ocurrió lo siguiente:?

callThatFunction ( array (k1 => v1, k2 => v2, ... kn = vn) + ($ cond array (clave => valor): array()) )

seguirá siendo apreciar una sugerencia para tantos que exprese la intención más directamente

6

Deja que después de la declaración de matriz:

$someConfig = array(
... 
); 

if($cond){ $someConfig['k2'] = $v2; } 
+0

Gracias, he editado mi pregunta para enfatizar lo siguiente: actualmente no hay nombre para la matriz – shealtiel

30

Usted puede utilizar el operador condicional cond ? true-expr : false-expr:

$someConfig = array(
    'k1' => 'v1', 
    'k2' => $cond ? 'v2a' : 'v2b' 
); 

La expresión condicional $cond ? 'v2a' : 'v2b' rendirá 'v2a' si $cond evalúa a true y 'v2b' de lo contrario. Pero esto solo funciona con el valor de una clave.

Si sólo desea agregar una clave basada en una condición, es necesario utilizar una por separado if:

$someConfig = array('k1' => 'v1'); 
if ($cond) { 
    $someConfig['k2'] = 'v2'; 
} 

Editar Puede agregar claves condicional sin una variable mediante el array union operator o array_merge:

array('k1' => 'v1') + ($cond ? array('k2' => 'v2') : array()) 
array_merge(array('k1' => 'v1'), $cond ? array('k2' => 'v2') : array()) 

Ahora tiene que decidir lo que es más fácil de leer o mejor para mantener

+0

Gracias, conscientes de esto, he editado mi pregunta para enfatizar lo siguiente: actualmente no hay ningún nombre para la matriz. Acondicionar solo el valor no es lo que necesito - Necesito que el par no exista si cond es falso – shealtiel

+0

@gidireich: Aquí tienes. – Gumbo

+0

Lo de array_merge es asombroso, pero ¡vaya! Feo: P – GWW

-1

creo que todas estas respuestas hasta el momento dejará un trozo de algún tipo en la matriz cuando la condición no se cumple

Sugiero configurar la matriz en su totalidad, luego use la función desarmar para eliminar las que no desea. Esto proporcionará una matriz limpia con solo lo que desea y también es fácil de leer.

So ...

$shapes = array('one'=>'circle, 'three'=>'triangle, 'four'=>'square', 'five'=>'pentagon') 
if($i_like_curves==false){ 
    unset($shapes['one']); 
} 
0

Puede asignar todos los valores y filtrar teclas de vacío de la matriz a la vez como esto:

$myArray = array_filter([ 
    'k1' => 'v1', 
    'k2' => $cond ? 'v2' : false 
]); 

Esto le permite evitar el condicional después de los hechos y la OMI es bastante legible.

Cuestiones relacionadas