2010-11-07 25 views
13

Hệ thống của tôi gửi một mảng cấu hình để một chức năng như thế này:Một yếu tố điều kiện bên trong một mảng (...) xây dựng

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

Tôi muốn làm cho một trong những cặp giá trị quan trọng, có điều kiện thuận một số trường hợp.

Tôi có thể làm điều này mà không tạo biến cho mảng (và điều này vi phạm cú pháp cấu hình sạch mà người khác đã tạo) không?

Như thế này

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

Trên đây là rõ ràng là sai cú pháp, nhưng phải thể hiện ý tưởng của tôi.

Cảm ơn bạn

Trả lời

1

Cuối cùng tôi đã đưa ra như sau:?

callThatFunction ( mảng (k1 => v1, k2 => v2, ... kn = vn) + ($ cond mảng (key => giá trị): mảng()) )

vẫn sẽ đánh giá cao một gợi ý cho somethings rằng sẽ bộc lộ ý định trực tiếp hơn

6

Đặt nó sau khi tuyên bố mảng:

$someConfig = array(
... 
); 

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

Cảm ơn, tôi đã chỉnh sửa câu hỏi của mình để nhấn mạnh những điều sau: hiện tại không có tên cho mảng – shealtiel

30

Bạn có thể sử dụng toán tử điều kiện cond ? true-expr : false-expr:

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

Các biểu thức điều kiện $cond ? 'v2a' : 'v2b' sẽ mang lại 'v2a' nếu $cond đánh giá để đúng'v2b' nếu không. Nhưng điều này chỉ hoạt động với giá trị của một khóa.

Nếu bạn chỉ muốn thêm một chìa khóa dựa trên một điều kiện, bạn cần phải sử dụng một riêng biệt if:

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

Sửa Bạn có thể thêm các phím điều kiện mà không có một biến bằng cách sử dụng array union operator hoặc array_merge:

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

Bây giờ bạn cần quyết định nội dung dễ đọc hơn hoặc tốt hơn để duy trì.

+0

Cảm ơn, nhận thức được điều này, tôi đã chỉnh sửa câu hỏi của mình để nhấn mạnh những điều sau: hiện không có tên cho mảng. Chỉ có điều kiện giá trị không phải là những gì tôi cần - Tôi cần cặp không tồn tại nếu cond là false – shealtiel

+0

@gidireich: Có bạn đi. – Gumbo

+0

Điều array_merge là tuyệt vời, nhưng wow là nó xấu xí: P – GWW

-1

tôi nghĩ rằng tất cả những câu trả lời cho đến nay sẽ để lại vẫn còn sơ khai của một số loại trong mảng khi điều kiện không được đáp ứng.

Tôi khuyên bạn nên đặt mảng đầy đủ, sau đó sử dụng chức năng bỏ đặt để xóa những thứ bạn không muốn. Điều này sẽ cung cấp cho một mảng sạch với chỉ những gì bạn muốn và cũng dễ đọc.

Vì vậy, ...

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

Bạn có thể gán tất cả các giá trị và lọc phím trống từ mảng cùng một lúc như thế này:

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

này cho phép bạn tránh được những điều kiện sau khi thực tế và imo nó khá dễ đọc.

Các vấn đề liên quan