У меня есть образец функции для генерации уникальных идентификаторов:
function generate_uuid($needed_ids_num = 1, int $random_bytes_length = 6)
{
$ids = [];
while (count($ids) < $needed_ids_num) {
$id = bin2hex(random_bytes($random_bytes_length));
if (!isset($ids[$id])) $ids[$id] = true;
}
$ids = array_keys($ids);
return $ids;
}
У меня есть эти уникальные идентификаторы в базе данных:
$ids_from_database = array(
'ad5dcc895ddc',
'3d036129b5b4',
'db569298c1ea',
'f919a34b31db'
);
Как я могу сгенерировать уникальный идентификатор, сравнивая уже существующие идентификаторы из базы данных?
Моя переписанная вариантная функция — это образец:
function generate_uuid(array $ids_from_database, int $needed_new_ids = 1, int $random_bytes_length = 6)
{
$temp = $ids;
$needed_ids_num = count($ids) + $needed_ids;
while (count($ids) < $needed_ids_num) {
$id = bin2hex(random_bytes($random_bytes_length));
if (!isset($ids[$id])) $ids[$id] = true;
}
$ids = array_keys($ids);
$result = array_diff($ids, $temp);
return [
'new_uuid' => $result,
'ids' => $ids
];
}
Почему моя написанная функция не возвращает массив результатов в неверном варианте?
Если я не понял вашу проблему, я думаю, что ваша первая функция была в порядке, просто нужно передать идентификаторы, которые вы получили от db в этом случае $ids_from_database
, Просто вычислите разницу между массивом array_diff()
и передать результат с уникальными идентификаторами и всеми идентификаторами базы данных. Надеюсь, это поможет.
<?php
function generate_uuid(array $ids_from_database, int $needed_ids_num = 1, int $random_bytes_length = 6)
{
$temp = $ids_from_database;
$ids = [];
while (count($ids) < $needed_ids_num) {
$id = bin2hex(random_bytes($random_bytes_length));
if (!isset($ids[$id])) $ids[$id] = true;
}
$result = array_diff($ids, $temp);
return [
'new_uuid' => $result,
'ids' => $temp
];
}
$ids_from_database = array(
'ad5dcc895ddc',
'3d036129b5b4',
'db569298c1ea',
'f919a34b31db'
);
$generated_ids = generate_uuid($ids_from_database);
print '<pre>';
print_r($generated_ids);
print '</pre>';
?>
DEMO: https://eval.in/1029502
Других решений пока нет …