Shull
@Shull
хочу быть хорошим IT-шником

Почему идёт округление при добавлении microtime(true) в качестве ключа ассоциативного массива?

Есть код:
Ссылка на страничку с кодом
<?php

$our_array;

$our_array[]=microtime(true);

$our_array[microtime(true)]="current_time";
print_r ($our_array);

?>


Если я просто добавляю дату - всё хорошо.
Но, если я добавляю даты в качестве ключа в паре с значением - идёт округление.
Я, в общем, не против, но мне нужно знать - это точно округление? Больше никаких сюрпризов не будет? Что, вообще, произошло?
  • Вопрос задан
  • 143 просмотра
Решения вопроса 1
Shull
@Shull Автор вопроса
хочу быть хорошим IT-шником
microtime(true) возвращает дробь, т.е., число с плавающей точкой (тип данных "double").
Однако, согласно https://www.php.net, ключ массива не может быть дробью, а только целым числом (integer).
key может быть либо типа integer, либо типа string. ...
Дополнительно с ключом key будут сделаны следующие преобразования:...
Числа с плавающей точкой (тип float) ... ... будут преобразованы к типу integer, то есть дробная часть будет отброшена. Например, ключ со значением 8.7 будет в действительности сохранен со значением 8.

То есть, любая дробь, сунутая в массив в качестве ключа, будет округлена.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
xEpozZ
@xEpozZ
Веб-разработчик
Хочу подчеркнуть из прочитанного в комментах:
1. Если нужен уникальный ID, то есть uuid во всех его реализациях.
2. Если нужен уникальный лексически возрастающий ID, то есть ulid

Если хотите использовать первый вариант, то делаете дополнительную колонку sort, кидаете на нее автоинкремент. В данном случае это только вспомогательная колонка, которая разрулит конфликты, когда по дате "ну чет не очень то и отсортировалось".
GROUB BY date DESC, sort DESC, в такой интерпретации date не у дел, поэтому можно просто
GROUB BY sort DESC.
Правда теперь со сливанием двух баз все равно будут некоторые проблемы. Но если вам sort не нужен будет, просто дропните его или реиндексируете на основе предыдущих таблиц :)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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