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

时间:2012-05-12 20:11:13

标签: php

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

例如,订单应为:

aaaaaa< aaaaab< aaaaac等......

4 个答案:

答案 0 :(得分:8)

uniqid()正在增加(稍后生成的ID将始终大于之前生成的ID),但不会是顺序的(会有间隙)。

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

答案 1 :(得分:5)

默认情况下,PHP Incrementing/Decrementing Operators可以直接使用字符串,请参阅http://php.net/manual/en/language.operators.increment.php

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

输出

  string 'aaaaac' (length=6)

答案 2 :(得分:1)

$id = 'aaaax';
for ($i=0; $i<100; $i++) {
    $id++;
    echo "$id\n";
}

演示 http://codepad.org/ogGrOfyQ

答案 3 :(得分: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并获得基本36转换后的身份。

提示:在id中添加salt值以防止泄漏实际的数据库ID。