PHP变量 - 相反的字符串

时间:2017-11-14 13:25:39

标签: php refactoring

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

最短,短,半,长,最长

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

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

这是我的代码,它正如我想要的那样工作,但它感觉有点重复和脏,所以我想知道是否存在更清晰/更智能的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>

谢谢。

3 个答案:

答案 0 :(得分:7)

这是一个如何将数组用作地图的小例子:

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

$width = 'short';
$widthOpposite = $widthMap[$width];

在您的代码中应该非常容易使用。

这可以进一步优化,因为您可以在一个地图中同时使用两个方向,当您还可以将array_flip用于另一个方向时,但在这种情况下,只需几个值就可以更简单。

答案 1 :(得分:5)

Here is one method without array mapping

// 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'

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

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'

答案 2 :(得分:4)

您可以制作具有相反值的数组,类似于普通的地图 - &gt;相反。简单的实施:

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;
}

现在您可以在视图中使用功能:

<div class="<?= $width ?>"></div>
<div class="<?= getOpposite($width) ?>"></div>