Что эквивалентно следующему (основанному в стиле 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')));