做一个随机八位数字的邀请码,感觉自己写的方法有些愚钝,望指正。问号?

场景:需要生成1000条随机的邀请码,邀请码唯一,八位的数字。
我的方法实现如下,然后打算用 seed 填充到数据库。

for ($i = 0; $i < 1000; $i++) {
        $arr1[] = $faker->unique()->randomElement(range(1111, 9999));
    }
for ($i = 0; $i < 1000; $i++) {
    $arr2[] = $faker->unique()->randomElement(range(1111, 9999));
}

foreach ($arr1 as $k => $v) {
    $arr1[$k] = (string)$v . (string)$arr2[$k];
}
dump($arr1);
dump(count($arr1));  // 1000
dump(count(array_unique($arr1))); // 1000

希望大家能给出更优雅,更优逼格的意见。谢谢

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 5

1000 条可以用这个,多了就不行了, 补充了数字的

$count = 1000;

    $codes = [];
    for ($i = 0; $i < $count; ++$i) {

        do {
            $code = str_pad(mt_rand(1, 99999999), 8, '0', STR_PAD_LEFT);

            if (! in_array($code, $codes)) {
                $codes[] = $code;
                break;
            }

        } while(true);
    }

    // 1000
    dd(count(array_unique($codes)));
8年前 评论
KayuHo

可以先创建一个模型工厂
php artisan make:factory CodeFactory

然后在工厂文件里面定义 /database/factories/CodeFactory.php 文件里面定义

$factory->define(App\Code::class, function (Faker\Generator $faker) {
    $time = now()->toDateTimeString();
    return [
        //
        'code' => $faker->randomNumber($nbDigits = 8, $strict = true), // 随机生成8个数字
        'created_at' => $time,
        'updated_at' => $time,
    ];
});

创建 seeder 填充文件,php artisan make:seeder CodeSeeder

在填充文件的 run() 方法里面

public function run()
{
        //
        $data = factory(\App\Code::class)->times(1000)->make();

        Code::insert($data->toArray());
}

最后记得在 DataBaseSeeder.php 文件里面的 run() 方法调用一下我们上面的 seeder 文件

执行 php artisan db:seed,应该就可以了

8年前 评论

@Joy_he 请问 randomNumber 的第二个参数 strict 是为了保证唯一的吗?

8年前 评论
KayuHo

@dptms 这个我也不太清楚第二个参数具体是做什么的,一开始填写的 false,但有些生成了7个数字,后面换成了 true 之后就是8个数字,所以我不敢确定具体有什么用,我追踪了一下源码,原谅我这种渣渣没有看懂,哈哈。如果你查到了相关文档麻烦也告知一下,谢谢。

另外如果想控制唯一可以用 unqiue(),你在生成表的时候也可以在这个字段限制 unique 索引

faker 文档 可以去看看这个文档,有很多方法

8年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!