PHP Проверить, является ли значение частью последовательности чисел с общей разницей - PullRequest
0 голосов
/ 29 августа 2018

Я пишу сценарий, который должен идентифицировать каждое седьмое число, где первое число последовательности равно 0 (таким образом, последовательность 6, 13, 20, 27, 34, 41, 48 и т. Д.)

Вот что я получил (работает ограниченным образом), но я бы предпочел написать цикл, чтобы значения в последовательности не нужно было жестко кодировать:

<?php

$x = 7;

if ($x === 6 || $x === 13 || $x === 20 || $x === 27 || $x === 34 || $x === 41 || $x === 48) {
    $result = 1;
  } else {
    $result = 0;
}

echo $result;

?>

Заранее спасибо за любые советы!


Обновление: вот мой обновленный скрипт, использующий решение @robbieaverill и проверяющий значения по массиву. Здесь есть много отличных решений, спасибо всем!

<?php

$divisor = 7;
$limit = 500; 

$sequence = array();

for ($i = 0; $i <= $limit; $i++) {
  if (is_int(($i + 1) / $divisor)) {
    $sequence[] = $i;
  }
}

$x = 41;

if (in_array($x, $sequence, true)) {
  $result = 1;
} else {
  $result = 0;
}

echo $result;
?>

Вывод здесь равен 1, что означает, что если значение $ x равно 41, оно находится в массиве $ sequence.

Ответы [ 7 ]

0 голосов
/ 29 августа 2018

Так что, если у вас есть список номеров, лучше всего будет

<?php
   $list = array(0,1,8,89,785,0,789785,56,8,9,1,2,3,2);
   for($i = 0; $i < count($list);$i++){
      if($list[$i] === 0){
          echo "Found and occurence. Value is ".($list[$i+7])."<br>";
       }
    }
?>

Будет выводить Нашел и вхождение. Значение 56 Нашел и вхождение. Значение 3

0 голосов
/ 29 августа 2018

Попробуйте использовать range для генерации серии:

$begin = 6;
$end = 48;
$step = 7;
$seq = range($begin, $end, $step);
print_r($seq);

Затем вы можете проверить, входит ли число в эту серию, используя in_array:

if (in_array(41, $seq)) // ...

Смотрите его в прямом эфире на 3v4l.org.

Это никоим образом не эффективно, но это очевидная реализация, которая очень хорошо работает для небольших серий. Под малым я подразумеваю тысячи записей или меньше.

0 голосов
/ 29 августа 2018

Добавьте 1 к порядковому номеру $i и используйте модуль n и верните $i % 7 == 0.

* 1006 Е.Г. *

function isNth(int $i, int $nth, int $offset = -1): bool
{
    return !(($i - $offset) % $nth);
}

Пример использования:

foreach ([0,1,2,3,4,5,6,7,8,9,10,11,12,13] as $number)
{
    if (isNth($number, 7)) print "$number\n";
}

// will print 6\n13\n

foreach ([1,2,3,4,5,6,7,8,9,10,11,12,13,14] as $number)
{
    if (isNth($number, 7, 0)) print "$number\n";
}

// will print 7\n14\n
0 голосов
/ 29 августа 2018

В общем, мы могли бы написать арифметическую последовательность, подобную этой:

{a, a+d, a+2d, a+3d, ... }

Где а = 6 (первый член) d = 7 («общая разница» между терминами)

чтобы мы могли иметь {a, a + d, a + 2d, a + 3d, ...}

{6, 6 + 7, 6 + 2 × 7, 6 + 3 × 7, ...}

{6, 13, 20, 27, ...} так что мы можем иметь правило

x[n] = a + d(n−1)

который может быть написан на php как показано ниже

<?php
$a=6;
$n=10; //number of terms
$d=7;
for($i=1;$i<=10;$i++){
    echo $term=$a+($i-1)*$d;
    echo "<br>";
}

?>
0 голосов
/ 29 августа 2018

И вот еще один способ сделать это с помощью оператора модуля :

<?php
$start = 0;
$sequence = 7;
$limit = 100;

for ($i=$start; $i<$limit; $i++) {
    // if the divition of the current number / the sequence is a full number (there is no remainder) and we're not at 0
    if(($i+1) % $sequence == 0 && $i!=0) {
       echo $i . "<br>";
    }
}

// output:
6
13
20
27
34
41
48
55
62
69
76
83
90
97

Поскольку вы сказали "что необходимо идентифицировать каждое седьмое число" вы, возможно, захотите проверить, является ли данное число одним из 7, то есть вы хотите, чтобы функция тестировалась. Тогда это может помочь:

function isMultipleOf($input, $sequence) {
    if(($input+1) % $sequence == 0 && $input!=0) {
        return true;
    } else {
        return false;
    }

}


$check = 601;
echo isMultipleOf($check, $sequence); // true/1;
$check = 2;
echo isMultipleOf($check, $sequence); // false;
0 голосов
/ 29 августа 2018

Такое решение также будет работать.

$index = 0;
for($i = 0; $i <= 700; $i++){
    if($index == 6){
        echo $i . "<br/>";
        $index = 0;
    } else {
       $index++; 
    }
}

выведет 6 13 20 27 34 41 48 55

0 голосов
/ 29 августа 2018

Возможно, есть множество разных способов сделать это. Если вам нужно идентифицировать числа, которые делятся на 7 равномерно (плюс один, потому что вы основаны на нуле), вы можете сделать что-то вроде this :

$divisor = 7;
$limit = 100; // when do you want to stop searching?

for ($i = 0; $i <= $limit; $i++) {
    if (is_int(($i + 1) / $divisor)) {
        var_dump($i);
    }
}

Обратите внимание, что is_int() проверяет, является ли разделенный результат целым числом, для десятичного числа / числа с плавающей запятой возвращается false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...