2015-02-07 1 views
6

Ho cercato e testato per un po 'di tempo e proprio non riesco a trovare se quello che sto cercando di realizzare è possibile il modo in cui sto andando su di esso.PHP Istruzione ternaria all'interno della matrice associativa per impostare sia la chiave che il valore?

Vorrei aggiungere una coppia chiave/valore a un array, quando si definisce l'array, in base a un'istruzione ternaria.

Array(
    'Item 1' => 'Some value', 
    (FALSE)? NULL : 'Item 2' => 'Another Value' 
) 

mio/wanted comportamento previsto è per il risultato di essere poi:

Array (
    [Item 1] => Some value 
    [Item 2] => Another Value 
) 

E quando l'affermazione è vera:

Array(
    'Item 1' => 'Some value', 
    (TRUE)? NULL : 'Item 2' => 'Another Value' 
) 

Resa:

Array (
    [Item 1] => Some value 
) 

Ma invece ottengo:

Array (
    [Item 1] => Some value 
    [] => Another Value 
) 

che causa problemi poiché A) io non voglio che questo secondo elemento di esistere in primo luogo e B) Il valore della condizione False viene assegnato il valore True condizioni (in questo caso NULL, che imposta il chiave per NULL [])

Questo è molto particolare. È la mia unica opzione per avere un'istruzione if() {} standard e Pop l'elemento se la condizione è falsa (usando!) Nell'array?

Nota: avere un valore nullo per l'elemento 2 non è accettabile, piuttosto se la condizione iniziale è vera, nessun elemento deve esistere.

Qualsiasi aiuto sarebbe molto apprezzato!

+1

99% sicuro che questo non è possibile, cioè, che è necessario utilizzare 'if'. Ci penserò un po 'di più e vedrò se riuscirò a fare meglio. – Austin

+0

Non è possibile. O aggiungi un elemento a un array o non lo fai; non c'è modo di farlo condizionatamente in questo modo. Qual è esattamente il problema nell'usare un'istruzione 'if', comunque ...? Fa perfettamente il lavoro (qualcuno direbbe che è più intuitivo di un ternario). –

+0

In realtà [è possibile] (http://stackoverflow.com/a/29327671/367456) ma di solito non vuoi farlo./cc @Austin – hakre

risposta

7

Tutto quello che stai facendo con quell'operatore ternario è decidere il nome della chiave. L'elemento verrà inserito nell'array, non importa cosa, è proprio lì nella dichiarazione letterale dell'array.

Il meglio che si possa fare con un'espressione in linea è qualcosa di simile:

['foo' => 'bar'] + (true ? [] : ['baz' => 42]) 

In pratica, si dovrebbe probabilmente meglio scrivere:

$arr = ['foo' => 'bar']; 
if (true) { 
    $arr['baz'] = 42; 
} 

La scrittura di codice più compatto non è sempre il migliore obiettivo per avere, deve essere leggibile e comprensibile prima di tutto.

+0

Poiché questo è taggato in php-5.3, potrebbe essere meglio non usare la sintassi di array breve che è disponibile solo in 5.4+. Ma la risposta è ancora corretta. – imkingdavid

+0

Grazie, sono andato con il secondo metodo e il codice continua a leggere in modo pulito! – thatnetworkguy

+0

Il "non importa cosa" è il punto chiave qui. Puoi fallire: http://stackoverflow.com/a/29327671/367456 :) – hakre

0

Sarebbe possibile solo invalidando la dichiarazione.

Ad esempio, si prende un valore per la chiave che PHP non può gestire (ad esempio un array) e ogni volta che non si desidera aggiungere la voce, si utilizza quella chiave.

Il principio è in realtà simile a quello che hai contorno con il valore NULL:

Array(
    'Item 1' => 'Some value', 
    TRUE ? array() : 'Item 2' => 'Another Value' 
) 

Il rovescio della medaglia è che il codice è ingombrante, non è chiaro da leggere e dà avvertimenti:

Attenzione: Illegal tipo

compensare Così ho aggiungere questa risposta più per completezza.

esempio completa (online demo):

<?php 
/** 
* PHP Ternary statement within Associative Array to set both key & value? 
* @link http://stackoverflow.com/a/29327671/367456 
*/ 

var_dump(
    Array(
     'Item 1'     => 'Some value', 
     TRUE ? array() : 'Item 2' => 'Another Value', 
     FALSE ? array() : 'Item 3' => 'Just Another Value', 
    ) 
); 
+2

Questo è davvero sorprendente, anche se non dovresti mai farlo. – Austin