如何在循环中切换数学运算符并存储计算?

时间:2019-03-23 01:42:15

标签: php loops math toggle formula

我需要在一个循环中执行计算,所有其他迭代都应将+更改为-,反之亦然。

$mainNumber = 6;
$finalData = [];
$operator = '+';
for ($i = 1; $i <= $mainNumber; $i++) {
    switch ($operator) {
        case '-':
            $operator = '+';
            break;

        case '+':
            $operator = '-';
            break;
    }
    $finalData[] = "$mainNumber $operator $i";
}
dd($finalData);

我上面的代码输出如下

array:5 [▼
  0 => "6 - 1"
  1 => "6 + 2"
  2 => "6 - 3"
  3 => "6 + 4"
  4 => "6 - 5"
  5 => "6 + 6"
]

相反

array:5 [▼
  0 => "5"
  1 => "8"
  2 => "3"
  3 => "10"
  4 => "1"
  5 => "12"
]

2 个答案:

答案 0 :(得分:3)

只需要在循环中执行计算即可,而不是创建一个字符串(然后需要eval):

$mainNumber = 6;
$finalData = [];
$operator = '-';
for ($i = 1; $i <= $mainNumber; $i++) {
    switch ($operator) {
        case '-':
            $finalData[] = $mainNumber - $i;
            $operator = '+';
            break;
        case '+':
            $finalData[] = $mainNumber + $i;
            $operator = '-';
            break;
    }
}
print_r($finalData);

输出:

Array ( 
    [0] => 5
    [1] => 8
    [2] => 3
    [3] => 10 
    [4] => 1 
    [5] => 12
 )

Demo on 3v4l.org

答案 1 :(得分:1)

我发现开关组太冗长了。您可以单行使用数学。

如果$i为奇数,则将其设置为公式中的负因子。换句话说,您总是将$i的正或负值添加到$mainNumber

代码:(Demo

$mainNumber = 6;
$finalData = [];
for ($i = 1; $i <= $mainNumber; ++$i) {
    $finalData[] = $mainNumber + (($i & 1 ? -1 : 1) * $i);
}
var_export($finalData);

输出:

array (
  0 => 5,
  1 => 8,
  2 => 3,
  3 => 10,
  4 => 1,
  5 => 12,
)

其他说明:

当您需要多次评估相同条件并对照可预测的静态,奇异值检查结果时,开关块最有价值。这种情况只需要检查运算符是正还是负,换句话说就是if-else。在这里实现切换案例没有任何价值。

在这个问题中,将eval()与值得信赖的值一起使用可能是安全的,但是当涉及到用户提供的数据时,eval()会变得很忙,并且会car起干草叉-几乎所有人的普遍建议专业的开发人员应避免调用函数。