Как включить математический оператор и сохранить вычисления в цикле? - PullRequest
0 голосов
/ 23 марта 2019

Мне нужно выполнить вычисление в цикле, при котором каждая другая итерация должна изменить + на - и наоборот.

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

3 голосов
/ 23 марта 2019

Вместо того, чтобы создавать строку (которая вам тогда понадобится 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
 )

Демонстрация на 3v4l.org

1 голос
/ 24 марта 2019

Я считаю блоки переключателей ужасно многословными. Вы можете просто использовать математику в одной строке.

Если $i нечетно, установите его как отрицательный коэффициент в уравнении. Другими словами, вы всегда добавляете положительное или отрицательное значение от $i до $mainNumber.

Код: ( Демо )

$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,
)

Дополнительные примечания:

Блоки переключения наиболее полезны, когда вам нужно многократно оценивать одно и то же условие и сравнивать результат с предсказуемыми статическими единичными значениями. В этой ситуации нужно только проверить, является ли оператор плюсом или минусом - другими словами, если-иначе. Здесь нет смысла реализовывать регистр коммутатора.

Использование eval() может быть безопасным для использования с достоверными значениями в этом вопросе, но когда речь идет о пользовательских данных, eval() выращивает рога и выковывает вилы - общий совет почти всех профессиональных разработчиков состоит в том, чтобы Избегайте вызова функции.

...