PHP变量 - 相反的字符串

sen*_*tus 2 php refactoring

我有一个变量$ width,可以是一个包含以下任何一个值的字符串:

最短,短,半,长,最长

在我的模板中,我想创建2个元素 - 一个具有$ width的原始值,另一个具有相反的宽度:

  • 短期与长期相反,反之亦然
  • 最短的是最长的,反之亦然
  • 一半与一半相反

这是我的代码,它完全按照我的意愿工作,但它对我来说感觉有点重复和肮脏,所以我想知道是否存在更清晰/更智能的PHP语法来存储相反的字符串对并重构/缩短代码或者是尽可能精益求精?

<?
// Possible values - shortest, short, half, long, longest 
$width = '';

if ($width == 'shortest') {
    $opposite_width = 'longest';
}
if ($width == 'short') {
    $opposite_width = 'long';
}
if ($width == 'half') {
    $opposite_width = 'half';
}
if ($width == 'long') {
    $opposite_width = 'short';
}
if ($width == 'longest') {
    $opposite_width = 'shortest';
}

?>

<div class="<?= width ?>"></div>
<div class="<?= opposite_width ?>"></div>
Run Code Online (Sandbox Code Playgroud)

谢谢.

xan*_*der 7

这里有一个如何使用数组作为映射的小例子:

$widthMap = [
    'shortest' => 'longest',
    'short' => 'long',
    'half' => 'half',
    'long' => 'short',
    'longest' => 'shortest'
];

$width = 'short';
$widthOpposite = $widthMap[$width];
Run Code Online (Sandbox Code Playgroud)

应该很容易在您的代码中使用.

这可以进一步优化,因为你在一个地图中有两个方向,当你也可以array_flip用于另一个方向时,但在这种情况下,只需几个值就可以更简单.


asl*_*win 5

您可以使数组具有相反的值,就像普通的地图->对面的。简单实施:

function getOpposite($word) {
    $map = [
       'shortest' => 'longest',
       'short' => 'long',
       'half' => 'half'
    ];

    if(isset($map[$word])) {
        return $map[$word];        
    }

    //reverse finding
    $flippedMap = array_flip($map);

    if(isset($flippedMap[$word])) {
        return $flippedMap[$word];        
    }

    return null;
}
Run Code Online (Sandbox Code Playgroud)

现在您可以在视图中使用function了:

<div class="<?= $width ?>"></div>
<div class="<?= getOpposite($width) ?>"></div>
Run Code Online (Sandbox Code Playgroud)


Jay*_*ard 5

这是一种没有数组映射的方法:

// Possible values - shortest, short, half, long, longest 

function opposite($width) {
    $widths = array('shortest', 'short', 'half', 'long', 'longest');
    $widthCount = count($widths) - 1;
    $position = array_search($width, $widths);
    $newPosition = $widthCount - $position;
    $oppositePosition = $widths[$newPosition];
    return $oppositePosition;
}

echo opposite('half'); // 'half'
Run Code Online (Sandbox Code Playgroud)

计算数组我不必担心制作地图,这意味着我可以添加到数组而无需修改函数.这可以通过传入针和干草堆进一步修改,这意味着该函数可以使用多个数据集(任何大小的数组)而无需修改.

function opposite($width, $oppositeOf) {
    $widthCount = count($oppositeOf) - 1;
    $position = array_search($width, $oppositeOf);
    $newPosition = $widthCount - $position;
    $oppositePosition = $oppositeOf[$newPosition];
    return $oppositePosition;
}

$widths = array('shortest', 'short', 'half', 'long', 'longest');
echo opposite('long', $widths); // 'short'

$sizes = array('skinnier', 'skinny', 'average', 'above average', 'hefty', 'heftier');
echo opposite('above average', $sizes); // 'average'
Run Code Online (Sandbox Code Playgroud)