2

如何在 PHP 中生成渐进式顺序唯一 ID?

例如,顺序应该是这样的:

aaaaaa < aaaaab < aaaaac 等等...

4

4 回答 4

8

uniqid()正在增加(后面生成的 ID 总是大于前面生成的 ID),但不会是连续的(会有间隙)。

否则,找到一种方法来保存最后生成的 ID,并在生成新 ID 时将其递增。

于 2012-05-12T20:13:02.537 回答
5

这是默认情况下在 PHPIncrementing/Decrementing Operators中可以直接使用字符串请参阅http://php.net/manual/en/language.operators.increment.php

$start = "aaaaaa" ;
$start++;
$start++;
var_dump($start);

输出

  string 'aaaaac' (length=6)
于 2012-05-12T20:14:52.980 回答
1
$id = 'aaaax';
for ($i=0; $i<100; $i++) {
    $id++;
    echo "$id\n";
}

演示 http://codepad.org/ogGrOfyQ

于 2012-05-12T20:14:32.333 回答
0

如果您在此处使用任何其他解决方案,您仍然必须获取或保存最后一个 id,然后将其递增。相反,您可以简单地使用自动递增的 id 并将其转换为文本表示。

我在这里使用 Laravel 示例,但您可以将理论应用于任何框架。

// Save your model.
$flight = new Flight;
$flight->name = $request->name;
$flight->save();

// $flight->id now contains the last inserted id.
echo base_convert($flight->id, 10, 36);

// Output: 1E86

以 10 为底的是 0-9 的数字。Base 36 将字母表中的 26 个字母添加到其中。

请注意,实际上不需要将输出保存回数据库,这将需要另一个查询并破坏此优化的目的。相反,您可以添加一个实时转换 id 的 mutator:

class Flight extends Model {
    ...
    public function getUniqueIdAttribute()
    {
        return base_convert($this->id, 10, 36);
    }
}

现在您可以简单地保存您的模型并调用$flight->uniqueId并获取您的 base 36 转换后的 id。

提示:向 id 添加盐值以防止泄漏实际的数据库 id。

于 2018-03-19T13:57:43.943 回答