2010-11-07 17 views
13

Mój system wysyła wachlarz konfiguracji do funkcji takich jak to:Warunkowe wewnątrz elementu tablicy (...) skonstruować

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

Chcę, aby jedna z par wartości kluczowych, uzależnione od pewnych okolicznościach.

Czy mogę to zrobić bez tworzenia zmiennej dla tablicy (i to zerwanie czystej składni konfiguracyjnej utworzonej przez kogoś innego)?

Ci się to

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

Powyższe jest oczywiście błędne składniowo, ale należy wyrazić mój pomysł.

Dziękuję

Odpowiedz

1

W końcu wpadłem na następujący:

callThatFunction ( array (k1 => v1, k2 => v2, ... kn = vn) + ($ dyr array (key => wartości): array()) )

nadal doceniają sugestie latków, które będą wyrażać zamiar bardziej bezpośrednio

6

Umieścić go po deklaracji tablicy:

$someConfig = array(
... 
); 

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

Dzięki, zredagowałem moje pytanie, aby podkreślić następujące: obecnie nie ma nazwy tablicy – shealtiel

30

Można użyć operatora warunkowego cond ? true-expr : false-expr:

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

Wyrażenie warunkowe $cond ? 'v2a' : 'v2b' przyniesie 'v2a' jeśli $cond ocenia się true i 'v2b' w przeciwnym razie. Ale działa to tylko z wartością klucza.

Jeśli chcesz tylko dodać klucz na podstawie warunku, trzeba użyć osobnego if:

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

Edycja Możesz dodać klucze warunkowo bez zmiennej za pomocą array union operator lub array_merge:

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

teraz trzeba zdecydować, co jest bardziej czytelny lub lepiej go utrzymywać.

+0

Dzięki, świadomy tego, zredagowałem moje pytanie, aby podkreślić następujące: obecnie nie ma nazwy tablicy. Uwarunkowanie tylko wartości nie jest tym, czego potrzebuję - potrzebuję pary, która nie istnieje, jeśli cond jest fałszywe – shealtiel

+0

@gidireich: Proszę. – Gumbo

+0

Rzecz array_merge jest niesamowita, ale wow jest brzydka: P – GWW

-1

Myślę, że wszystkie z tych odpowiedzi tak daleko zostawi niedopałek jakiegoś w tablicy gdy warunek nie jest spełniony.

Sugeruję ustawienie całej tablicy, a następnie użyj funkcji unset, aby usunąć te, których nie chcesz. Zapewni to czystą tablicę zawierającą tylko to, co chcesz i będzie również czytelny.

Więc ...

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

można przypisać wszystkie wartości i filtrować pustych kluczy z tablicy naraz tak:

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

To pozwala uniknąć warunkowego po fakcie i imo jest dość czytelny.

Powiązane problemy