Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

И для PHP 7:

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

Начиная с PHP 7, вы можете использовать оператор null коалесценции:

Нулевой коалесцирующий оператор (??) был добавлен в качестве синтаксического сахара для общего случая, когда нужно использовать тройной в сочетании с Исеть(). Он возвращает свой первый операнд, если он существует, и не является 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';

Ответ 5

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

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

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

Ответ 6

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

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

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

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

Ответ 7

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

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

Ответ 8

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

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