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

How to toggle mathematical operator and store calculations in a loop?

我需要在循环中执行计算,每隔一次迭代应将 + 更改为 -,反之亦然。

$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"
]

与其创建字符串(然后您需要 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

我发现开关块非常冗长。您可以只在一行中使用数学。

如果$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。在这里实现 switch case 没有任何价值。

使用 eval() 与这个问题中值得信赖的值一起使用可能是安全的,但是当涉及到用户提供的数据时,eval() 长角和干草叉 - 来自的一般建议几乎所有的专业开发人员都是为了避免函数调用。