Mesuti
@Mesuti

Как сгенерировать уникальный элемент по отношению к массиву?

Создаю ключи с помощью $unique = uniqid()

Как дополнительно сверить uniqid() с каждым ключем массива и только если совпадений не найдено, сохранить в переменную?


Безуспешно пробую сделать поиск через перебор массива
$arr = R::getAll('SELECT `key` FROM `itemscategory` WHERE `id_user` = 100'); 
$unique = "5e9dfcc49a460"; // существующий key 

if (array_key_exists($unique, $arr)) {
  $unique = uniqid();
} else {
  $reallyUniqueKey = $unique;
   echo $reallyUniqueKey;  // 5e9dfcc49a460
}

var_dump($arr);

array(4) {
  [0]=>
  array(1) {
    ["key"]=>
    string(13) "5e9dfcc295981"
  }
  [1]=>
  array(1) {
    ["key"]=>
    string(13) "5e9dfcc49a460"
  }
  [2]=>
  array(1) {
    ["key"]=>
    string(13) "5e9dfcc5b1ff8"
  }
  [3]=>
  array(1) {
    ["key"]=>
    string(13) "5e9dfcc637f75"
  }
}

  • Вопрос задан
  • 168 просмотров
Решения вопроса 1
scottparker
@scottparker
if(!in_array($unique, $arr))
  $unique = uniqid();
else
  $reallyUniqueKey = $unique;

 echo $reallyUniqueKey;
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
sergiks
@sergiks Куратор тега PHP
♬♬
Искать в массиве можно так:
if (0 === count(array_filter($arr, function($el) use ($unique) {return $el['key'] == $unique;}))) {
    // йее, уникальное!
} else {
    // нашлись с таким значением
}


Фикс по-быстрому: добавить параметры: uniqid('', TRUE)
Это повысит «уникальность» генерируемых значений и риск повторов.

Решение «на авось»: генерить и записывать в БД. Посчитать число строк, и число строк с DISTINCT `key` — они не совпадут, если были повторы.

Решение paranoid android: цикл. Генерировать, проверять, в случае опять-неуникальности повторять. Завести счётчик неудачных попыток. С сожалением вываливаться в Exception при превышении 1 млн. неудачных попыток создать что-то уникальное.
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
О господи.
Ну я же писал тебе как делать
$unique = "5e9dfcc49a460";
$arr = R::getAll('SELECT `key` FROM `itemscategory` WHERE `id_user` = ? and title = ?',[$user_id, $unique]);

Хотя да, ты же SQL-то не знаешь. Того злодея, который детям говорит чтоодной команды R::getAll() достаточно для создания сайтов, и они теперь могут делать всё что угодно, и больше ничего учить не надо, надо бы сунуть головой в унитаз.

Но судя по постановке задачи ты в любом случае какой-то ад делаешь. Не в смысле реализации, а в смысле исходной задачи.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы