PHP: Как присвоить переменную одной из двух строк, если одна пустая? - PullRequest
6 голосов
/ 16 января 2012

Мне интересно, почему это не работает для присвоения строки $separator:

$separator = $options['title-separator'] || ' | ';

В других местах $ опция была назначена некоторому тексту или пустой строке. (На самом деле, в моем случае из реальной жизни, это какой-то текст или ЛОЖЬ, но в любом случае ...). Разделитель $ имеет значение ИСТИНА вместо строки.

Следующее выполняет то, что я хочу, но кажется излишне многословным:

$separator = ( $s = $options['title-separator'] ) ? $s : ' | ';

Я пришел из JavaScript, где оба эти примера имеют одинаковый результат, что мне кажется логичным. Что мне нужно понять о PHP, чтобы это имело смысл? Прямо сейчас, меня просто раздражают сотни дополнительных символов, которые потребуются для каждого места, где используется опция. :) Спасибо!

Ответы [ 6 ]

5 голосов
/ 16 января 2012

Первый

$seperator = isset($options['title-seperator'])
  ? $options['title-separator']
  : ' | ';

не многословен, он просто завершен в том, что хочет, он говорит вам. Тем не менее, с PHP5.3 вы можете использовать ярлык

$seperator = $options['title-seperator'] ?: ' | ';

Но вы получите много уведомлений о неопределенных индексных ключах. Рекомендую остановиться на первом примере.

Другое (на мой взгляд) более чистое решение - ввести значения по умолчанию. Вместо использования параметров «как есть» объедините их с массивом предопределенных значений

$defaults = array(
  'title-separator' => ' | '
);
$options = array_merge ($defaults, $options);

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

5 голосов
/ 16 января 2012

Смотрите это в функции объединения PHP 5.3 ?::

Функция объединения для PHP?

Итак, вы можете написать:

$separator = $options['title-separator'] ?: ' | ';

РЕДАКТИРОВАТЬ: Как говорит KingCrunch, вы получите это уведомление:

Notice: Undefined index: ...

, но только если вы так настроили свою систему.

В нашей кодовой базе PHP определена пользовательская функция coalesce(...), которая возвращает первую альтернативу, для которой isset() возвращает true.

4 голосов
/ 14 июля 2016

В PHP 7 введен оператор Null Coalescing, в котором вы можете использовать, например,

$first_name = $_POST['f_name'] ?? 'no data found';

Более подробно вы можете обратиться к моему посту Оператор Null Coalescing .

3 голосов
/ 16 января 2012

Мне интересно, почему это не работает для присвоения строки $ separator

Потому что язык не определен таким образом ....

Определение || оператор говорит, что $ a || $ b возвращает TRUE, если $ a или $ b равно TRUE, но не возвращает $ a, если $ a имеет значение TRUE.

1 голос
/ 07 ноября 2015

Это можно сделать!Не совсем так, как в javascript, так как языки работают по-разному.

Вот как вы можете это сделать, вроде как вы делаете это в javascript:

($separator = $options['title-separator'])
    || ($separator = ' | ');

Разница в том, что вы естьпроверка по переменной после выполнения присваивания.Потому что PHP не будет продолжать и выполнять что-либо после ||если первая часть оценивается как ИСТИНА, то в итоге вы выполняете только первое задание.

На мой взгляд, это очень аккуратный и понятный способ связать запасные варианты.При необходимости вы могли бы связать больше резервных назначений, что было бы намного сложнее с обычными операторами if и то же самое с сокращением "?:"

0 голосов
/ 07 января 2014

Вы можете сделать функцию.

if(!function_exists('gettrue')){
  function gettrue(){
    $args = func_get_args();
    foreach($args as $arg){
      if($arg) return $arg;
    }

    return $arg;
  }  
}

$test = gettrue(false, 0, '', 'yes');
var_dump($test);  // string(3) "yes"
...