2016-04-06 15 views
12

Thứ nhất là có một tên cho biểu thức này?PHP tương đương nhanh nhất của javascript `var a = var1 || var2 || var3;` biểu thức

Javascript

var value = false || 0 || '' || !1 || 'string' || 'wont get this far'; 

value bằng string (string) hay còn gọi là tùy chọn thứ năm

PHP

$value = false || 0 || '' || !1 || 'string' || 'wont get this far'; 

$value bằng true (bool)

Tôi có ngay trong suy nghĩ cách chính xác để đạt được kết quả tương tự như JavaScript là bằng cách lồng ghép các toán tử bậc ba? Giải pháp tốt nhất là gì ?

+1

Đó là 'true' only..Test 'tiếng vang thật;' – Rayon

+0

Bạn có thể muốn kiểm tra [này] (http://stackoverflow.com/questions/5694733/does-php-have-short-circuit -giảm giá). –

+3

Trong JS, chúng được gọi là đánh giá ngắn mạch – Xufox

Trả lời

15

Nhà điều hành tương đương trong PHP là ?:, đó là ternary operator mà không cần phần giữa:

$value = false ?: 0 ?: '' ?: !1 ?: 'string' ?: 'wont get this far'; 

$a ?: $b là viết tắt cho $a ? $a : $b.

+0

Tôi nghĩ rằng câu hỏi không phải là về toán tử ternary. Nhưng OP nhầm lẫn được gọi là toán tử bậc ba thay vì đánh giá ngắn mạch. –

+1

Trong Javascript '||' trả về * một trong các toán hạng *, không phải là boolean. Cách tương đương để làm điều đó trong PHP là '?:'. Đã trả lời câu hỏi. – deceze

+0

Cảm ơn bạn đã giải thích. Tôi đã giả định một cái gì đó khác. –

1

Kiểm tra này false || 0 || '' || !1 || true || 'wont get this far' sẽ trả về giá trị boolean. Nó sẽ trả lại true nếu bất kỳ giá trị nào là true, đó là cách hoạt động của OR. Nó không phải là một biểu thức bậc ba, áp dụng giá trị hợp lệ đầu tiên cho biến nhận.

Trả về 1 cho PHP vì bạn không truyền biểu thức dưới dạng boolean.

Bạn có thể làm điều này để làm cho sự biểu hiện trả về một giá trị boolean thay vì một số nguyên vào biến PHP của bạn:

$value = (bool)(false || 0 || '' || !1 || true || 'wont get this far');` 

Sự trở lại sẽ true.

+0

* "' .. || ..' sẽ trả về giá trị boolean ... "*, *" Bạn có thể làm điều này để làm cho biểu thức trả về giá trị boolean ... "* - Đó là nó? Có '||' trả về một boolean hay không? – deceze

+0

Nó trả về một boolean, nhưng không trực tiếp vào một biến, không có trong PHP. Tôi không nhận được hai downvotes, nhưng alrighty – Phiter

+0

Wut? Hoặc nó trả về một boolean hoặc nó không. Không có sự khác biệt cho dù bạn gán giá trị trả về vào một biến hay không. Giá trị là một giá trị. Giá trị trả về boolean của '||' sẽ không nhận được bất kỳ boolean nào bằng cách đúc nó. – deceze

1

Nếu bạn đang sử dụng PHP 5.3 trở lên, hãy xem deceze's answer.

Bạn có thể sử dụng toán tử thường xuyên lồng nhau thường xuyên khác.

$value = (false ? false : (0 ? 0 : ('' ? '' : (!1 ? !1 : ('string' ? 'string' : ('wont get this far' ? 'wont get this far' : null)))))); 

Wow thats ugly.

Bạn có thể sử dụng một mảng giá trị thay thế;

$array = array(false,0,'',!1,'string','wont get this far')); 

Bây giờ, tạo một hàm lặp qua mảng và trả về giá trị thực đầu tiên.

function array_short_circuit_eval($vars = array()){ 
    foreach ($vars as $var)if($var)return $var;return null; 
} 

$value = array_short_circuit_eval($array); 

echo $value; // string 
+0

'$ value = current (array_filter (mảng (false, 0, ...)))' - Tôi hy vọng không ai cần sử dụng nó, nhưng ở đây nó là ... – deceze

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