Использование короткого замыкания для получения первой ненулевой переменной - PullRequest
25 голосов
/ 20 ноября 2011

Что эквивалентно следующему (в стиле JS) в PHP:

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

Так что, если история существует, отправьте это; или если сообщение существует, то и т. д. ...

Ответы [ 8 ]

38 голосов
/ 05 июля 2013

Это будет (PHP 5.3 +) :

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

И для PHP 7 :

echo $post['story'] ?? $post['message'] ?? $post['name'];
16 голосов
/ 20 ноября 2011

Для этого есть однострочная строка, но она не совсем короткая:

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

array_filter вернет вам все ненулевые записи из списка альтернатив.И current просто получает первую запись из отфильтрованного списка.

6 голосов
/ 20 ноября 2011

Так как or и || не возвращают ни одного из своих операндов, это невозможно.

Вы можете написать для него простую функцию:

function firstset() {
    $args = func_get_args();
    foreach($args as $arg) {
        if($arg) return $arg;
    }
    return $args[-1];
}
5 голосов
/ 11 марта 2016

Опираясь на ответ Адама, вы можете использовать оператор контроля ошибок, чтобы помочь устранить ошибки, возникающие, когда переменные не установлены.

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

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

4 голосов
/ 25 февраля 2016

Начиная с PHP 7, вы можете использовать оператор объединения нулей :

Оператор объединения нулей (??) был добавлен как синтаксический сахар для общего случаянеобходимость использования троичного в сочетании с isset ().Возвращает свой первый операнд, если он существует и не равен NULL;в противном случае возвращается второй операнд.

// 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';
1 голос
/ 21 ноября 2011

Потому что разнообразие - это пряность жизни:

echo key(array_intersect(array_flip($post), array('story', 'message', 'name')));
1 голос
/ 20 ноября 2011

Вы можете попробовать это

<?php
    echo array_shift(array_values(array_filter($post)));
?>
1 голос
/ 20 ноября 2011

Этот синтаксис будет отображать 1, если какой-либо из них установлен, а не ложь, и 0, если нет.

Вот способ, позволяющий сделать это одной строкой, который работает и может быть расширен для любого числа параметров:

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

... довольно уродливо, хотя.Изменить: Марио лучше, чем мой, так как он уважает выбранный вами произвольный порядок, как это делает, но в отличие от этого, он не становится все более уродливым с каждой новой опцией, которую вы добавляете.

...