我有一个变量$ 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)
谢谢.
这里有一个如何使用数组作为映射的小例子:
$widthMap = [
'shortest' => 'longest',
'short' => 'long',
'half' => 'half',
'long' => 'short',
'longest' => 'shortest'
];
$width = 'short';
$widthOpposite = $widthMap[$width];
Run Code Online (Sandbox Code Playgroud)
应该很容易在您的代码中使用.
这可以进一步优化,因为你在一个地图中有两个方向,当你也可以array_flip用于另一个方向时,但在这种情况下,只需几个值就可以更简单.
您可以使数组具有相反的值,就像普通的地图->对面的。简单实施:
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)
// 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)