2015-02-07 10 views
6

Szukałem i testowałem przez jakiś czas i po prostu nie mogę stwierdzić, czy to, co próbuję osiągnąć, jest możliwe w sposób, w jaki to robię.Instrukcja Ternary PHP w tablicy asocjacyjnej, aby ustawić zarówno klucz i wartość?

Chciałbym dodać parę klucz/wartość do tablicy, definiując tablicę, na podstawie instrukcji trójskładnikowej.

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

Moja oczekiwano/chciał zachowanie jest wynikiem aby następnie być:

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

A gdy stwierdzenie jest prawdziwe:

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

Wydajność:

Array (
    [Item 1] => Some value 
) 

Ale zamiast tego otrzymuję:

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

co powoduje problemy od A) Nie chcę tego drugiego elementu istnieć w pierwszej kolejności oraz b) Fałsz wartość warunek jest przypisany do Prawdziwego warunki wartość (w tym przypadku null, która ustawia klucz do NULL [])

To jest bardzo dziwne. Czy moja jedyna opcja ma standardową instrukcję if() {} i Pop element, jeśli warunek jest fałszywy (przy użyciu!) Do tablicy?

Uwaga: posiadanie wartości pustej dla pozycji 2 jest niedopuszczalne, a jeśli warunek początkowy jest prawdziwy, żaden element nie powinien w ogóle istnieć.

Każda pomoc będzie bardzo ceniona!

+1

99% pewien, że to nie jest możliwe, to znaczy, że trzeba użyć 'if'. Zastanowię się jeszcze trochę i zobaczę, czy mogę to zrobić lepiej. – Austin

+0

Nie jest to możliwe. Albo dodajesz element do tablicy, albo nie; nie ma sposobu, aby zrobić to warunkowo. Czym właściwie jest problem z używaniem instrukcji "if", w każdym razie ...? Robi to doskonale (niektórzy twierdzą nawet, że jest bardziej intuicyjny niż trójkowy). –

+0

To rzeczywiście [jest możliwe] (http://stackoverflow.com/a/29327671/367456), ale normalnie nie chcesz tego robić./cc @Austin – hakre

Odpowiedz

7

Wszystko, co robisz z tym potrójnym operatorem, to decyzja o nazwie klucza. Element zostanie wprowadzony do tablicy bez względu na to, co znajduje się w deklaracji literowej.

Najlepiej można zrobić z inline wypowiedzi jest coś takiego:

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

Praktycznie, powinieneś chyba lepiej napisać:

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

Pisanie kodu bardziej zwartą nie zawsze jest najlepszym celem mieć, musi być przede wszystkim czytelny i zrozumiały.

+0

Ponieważ jest to oznaczone jako php-5.3, lepiej nie używać krótkiej składni, która jest dostępna tylko w wersji 5.4+. Ale odpowiedź jest nadal poprawna. – imkingdavid

+0

Dziękuję, poszedłem z drugą metodą, a kod wciąż jest czysty! – thatnetworkguy

+0

Kluczem jest tutaj "nie ważne co". Możesz go zawieść: http://stackoverflow.com/a/29327671/367456 :) – hakre

0

Byłoby to możliwe tylko poprzez unieważnienie oświadczenia.

Na przykład przyjmujesz wartość dla klucza, którego PHP nie obsługuje (np. Tablica) i gdy nie chcesz dodawać wpisu, używasz tego klucza.

Zasada jest rzeczywiście podobny do tego, co masz obrys z wartością NULL:

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

Minusem jest to, że kod jest nieporęczne, nie jest jasne do odczytania i daje ostrzeżenia:

Ostrzeżenie: Niedozwolony typ przesunięcia

Dodam więc tę odpowiedź więcej, aby uzyskać kompletność.

Pełny przykład (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

To naprawdę niesamowite, nawet jeśli nigdy nie powinieneś tego robić. – Austin