Использование короткого замыкания для получения первой ненулевой переменной

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

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

Поэтому, если история существует, тогда опубликуйте это; или сообщение есть сообщение, которое и т. д.

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

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

    А для PHP 7 :

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

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

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

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

    Поскольку оба и or || не возвращайте один из своих операндов, что невозможно.

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

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

    Начиная с 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'; 

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

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

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

    Можешь попробовать

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

    Этот синтаксис будет эхом 1, если любой из них установлен, а не false, а 0, если нет.

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

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

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

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

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