如何在PHP中创建逐渐增加的PIN?

时间:2018-01-22 04:21:18

标签: php laravel

我目前正在开展一个我生成随机PIN的项目。最初,每个PIN以4位长度开始,即2345,5456等等。但是,我试图这样做,如果使用所有4位数的引脚,那么它会增加到5位数,然后是6位数。基本上你不会用完它!

我使用laravel并创建了一个特性:

<?php

namespace App\Traits;

use App\Models\Quiz;

trait QuizPinTrait
{
    private $pin = null;
    private $min, $max;

    private function setup() 
    {
        $this->min = 1111;
        $this->max = 9999;
        $this->pin = mt_rand($this->min, $this->max);
    }

    public function generate()
    {
        $this->setup();
        if ($this->checkNotInUse()) {
            return $this->pin;
        }

        return false;
    }

    private function checkNotInUse()
    {
        $inUse = Quiz::where('pin', $this->pin)->count();

        if (!$inUse || $inUse == 0) {
            return true;
        } else {
            // stuck here...
        }
    }
}

我首先考虑过将1加到最小值,将9加到最大值,但是,我不确定如何为此做出有效的解决方案。

2 个答案:

答案 0 :(得分:4)

您可以针对正在使用的PIN数组创建一个整数数组[1111,...,9999]和diff,以获取可用的PIN。

$isUse = Quiz:all()->pluck('pin');
$min = 1111;
$max = 9999;
$allPins = range($min,$max);
$notInUse = array_diff($allPins, $inUse);


// laravel one liner
$notInUse = collect(Quiz:all()->pluck('pin'))->diff(range($min,$max));

然后,当前范围没有更多可用时:

$min = $max+1;
$max *= 10;

答案 1 :(得分:1)

这是一个需要更少内存的版本。

选择0到9999之间的随机数。这是你的关键。然后你可以这样做:

function getPin() {

  static $lastPin = 0;
  $key = 4864;
  $lastPin++;
  return $lastPin ^ $key;

}

// Example: displaying lots of pins 
$i=0;
while($i++<10002) {
  echo getPin(), "\n";
}

这样做的缺点是它不是随机的。