PHP Есть ли лучший способ написать это, если + троичная функция? - PullRequest
2 голосов
/ 06 марта 2019

В основном он просто переключается между двумя значениями. Если я введу X, я получу 6, если я введу 6, я получу X. Если я введу что-либо еще, значение останется неизменным.

function change($val) {
  if ($val == "X" || $val == 6) { $val = $val=="X" ? 6 : "X"; } else
  if ($val == "J" || $val == 3) { $val = $val=="J" ?  3 : "J"; }
  return $val;
}

Это упрощенная версия функции, которую я на самом деле использую, поэтому не нужно спрашивать, зачем мне это нужно. Я пробовал это как и массив, но он не работает, так как я буду вводить другие числа, которые нужно вывести без изменения. Нужно ввести все цифры и буквы, но только изменить их в функции, остальные должны пройти без изменений.

Ожидаемый результат.

change(6)
X
change(8)
8
change(X)
6
change(L)
L
change(3)
J

Так что я в основном ищу более простой способ написать эту функцию, если она есть. Это выглядит уродливо, но лучше, если нет лучшего способа.

РЕДАКТИРОВАТЬ: Редактирование, чтобы добавить дополнительное условие, так как я не понимал, что код может сильно отличаться для одного или нескольких условий. Фактический код имеет пять условий, которые вы видите.

Ответы [ 5 ]

5 голосов
/ 06 марта 2019

Вы можете использовать это решение, если вы используете PHP> 7.0:

function change($val)
{
    return [6 => 'X', 'X' => 6][$val] ?? $val;
}

Для более ранних версий это может быть как:

function change($val)
{
    $changes = [6 => 'X', 'X' => 6];

    return isset($changes[$val]) ? $changes[$val] : $val;
}
1 голос
/ 06 марта 2019

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

https://3v4l.org/VD31E

<?php

function change($input) {
    switch($input) {
        case 'X':
            return 6;  
        case 6:
            return 'X';
        default: 
            return $input;
    }
}

var_dump(change(6));
var_dump(change('X'));
var_dump(change('something_else'));

Выход для 7.1.25 - 7.3.2

string (1) "X"

int (6)

string (14) "thing_else "


Если вам не нравятся множественные операторы возврата в функции, вы можете также реорганизовать ее:

https://3v4l.org/V722p

<?php

function change($input) {
    $return = $input;
    switch($input) {
        case 'X':
            $return = 6; 
            break;
        case 6:
            $return = 'X';
            break;
    }

    return $return;
}

var_dump(change(6));
var_dump(change('X'));
var_dump(change('something_else'));
1 голос
/ 06 марта 2019

Использовать троичный оператор:

// Return 6 if $val is 'X'
// Return 'X' if $val is 6
// Return same if $val is not 'X' and 6
function change($val) {
    return (($val == "X") ? 6 : ($val == 6 ? 'X' : $val));
}

Добавление в него нового (3-го) условия:

// Return 6 if $val is 'X'
// Return 'X' if $val is 6
// Return 3 if $val is 'J'
// Return 'J' if $val is 3
// Return same if $val is not 'X' and 6
function change($val) {
    return ($val == "X") ? 6 : 
               ($val == 6 ? 'X' : 
                   ($val == 'J') ? 3 :
                       ($val == 3) ? 'J' : 
                           $val

           );
}
0 голосов
/ 06 марта 2019
function change($val) {
    return $val == 6 ? "X" : ($val == "X" ? 6 : $val);
}
0 голосов
/ 06 марта 2019

В зависимости от варианта использования вы можете использовать str_replace () .

$string = str_replace([6, 'X'], ['X', 6]);
...