2011-11-20 28 views
23

tương đương với các nội dung sau (có trụ sở tại phong cách JS) trong PHP là gì:Sử dụng mạch ngắn để có được đầu tiên không null biến

echo $post['story'] || $post['message'] || $post['name']; 

Vì vậy, nếu câu chuyện tồn tại sau đó gửi đó; hoặc nếu thông báo tồn tại được đăng, v.v ...

+1

điểm trong điều hành như vậy là gì?Bạn không biết biến nào bạn muốn xuất ra? –

+1

Chỉ với 2 đối số bạn có thể sử dụng: 'echo isset ($ _ POST ['story'])? $ _POST ['story']: $ _POST ['message']; ', cuối cùng cố gắng làm tổ nó. – mj82

+1

Nó dựa trên luồng api facebook; chỉ một/hai trong số ba sẽ tồn tại trên mỗi bài đăng. –

Trả lời

37

Sẽ (PHP 5.3+):

echo $post['story'] ?: $post['message'] ?: $post['name']; 

Và đối với PHP 7:

echo $post['story'] ?? $post['message'] ?? $post['name']; 
+3

Bingo, đây là cách phù hợp để thực hiện như 5.3 –

+0

Giải pháp tốt nhất, thx ... Không biết cách này ;-) – algorhythm

+1

Điều này sẽ tạo cảnh báo cho các biến không được đặt – billyonecan

6

Vì cả hai or|| không trả lại một trong số các toán hạng của chúng không thể thực hiện được.

Bạn có thể viết một hàm đơn giản cho nó mặc dù:

function firstset() { 
    $args = func_get_args(); 
    foreach($args as $arg) { 
     if($arg) return $arg; 
    } 
    return $args[-1]; 
} 
+0

Yea Tôi nghĩ đây sẽ là cách khác của tôi, tôi đã hy vọng có một cách thực hiện ngắn hơn. –

+1

Cách dễ nhất sẽ chuyển đổi, ví dụ: để python: p – ThiefMaster

+0

Tôi nghĩ rằng vượt qua var không tồn tại để chức năng này sẽ gây ra lỗi. – pie6k

16

Có một lớp lót cho điều đó, nhưng nó không chính xác ngắn hơn:

echo current(array_filter(array($post['story'], $post['message'], $post['name']))); 

array_filter sẽ trả lại cho bạn tất cả các phi null mục từ danh sách các lựa chọn thay thế. Và current chỉ nhận được mục nhập đầu tiên từ danh sách được lọc.

+0

Điều này là hoàn hảo; Tôi muốn nói điều này là gần tương đương với những gì tôi đang tìm kiếm. Cảm ơn Mario! –

+0

+1 cho một lớp lót –

+1

Runtimewise, điều này sẽ làm gió lên liệt kê tất cả các giá trị, null hay không, phải không? Ví dụ JS sẽ dừng ở giá trị không null đầu tiên. –

1

Cú pháp đó sẽ lặp lại 1 nếu bất kỳ điều nào trong số này được đặt và không sai, và 0 nếu không.

Đây là một cách một dòng để làm điều này mà làm việc và có thể được mở rộng cho bất kỳ số tùy chọn:

echo isset($post['story']) ? $post['story'] : isset($post['message']) ? $post['message'] : $post['name']; 

... khá xấu xí mặc dù. Chỉnh sửa: Mario là tốt hơn so với tôi vì nó tôn trọng trật tự tùy ý của bạn như thế này, nhưng không giống như vậy, nó không tiếp tục xấu đi với mỗi tùy chọn mới mà bạn thêm vào.

+0

Nhưng tùy chọn tài khoản của bạn cho thiếu khóa liên kết mà sẽ tạo ra một lỗi php nếu không. – Manatax

1

Bạn có thể thử nó

<?php 
    echo array_shift(array_values(array_filter($post))); 
?> 
1

Bởi vì nhiều là gia vị của cuộc sống:

echo key(array_intersect(array_flip($post), array('story', 'message', 'name'))); 
4

Tính đến PHP 7, bạn có thể sử dụng null coalescing operator:

Nhà điều hành vô coalescing (??) đã được thêm vào như là cú pháp đường đối với trường hợp chung của cần phải sử dụng một ternary kết hợp với isset(). Nó trả về toán hạng đầu tiên của nó nếu nó tồn tại và không phải là NULL; nếu không nó sẽ trả về toán hạng thứ hai của nó.

// Coalescing can be chained: this will return the first 
// defined value out of $_GET['user'], $_POST['user'], and 
// 'nobody'. 
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody'; 
+0

Bây giờ chúng ta chỉ cần chờ đợi cho PHP 7 nhấn repos sản xuất, siêu vui mừng để sử dụng này. –

+0

Điều này sẽ không hoạt động cho câu hỏi như được yêu cầu trừ khi không phải tất cả các trường đều tồn tại vì nó sẽ không xử lý các chuỗi rỗng (trả về nếu một trường trống) như NULL. –

4

Xây dựng về câu trả lời của Adam, bạn có thể sử dụng toán tử kiểm soát lỗi để giúp ngăn chặn các lỗi được tạo ra khi các biến không được thiết lập.

echo @$post['story'] ?: @$post['message'] ?: @$post['name']; 

http://php.net/manual/en/language.operators.errorcontrol.php

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