Обработка больших чисел в PHP - PullRequest
0 голосов
/ 02 декабря 2011

Через пару минут я понял, что у меня была ошибка: магическое число 2147483647, это верхний предел для типа integer в PHP / 32.Мне нужно управлять числом биггеров в моей функции:

public function albumExists($name) // e.g. 104112826372452
{
   $albums = $this->getAlbums();

   // If $name is int, search the key in $albums
   if(is_int($name) && ($found = array_key_exists($id = intval($name), $albums)))
      return ($found ? $id : false);

   // Start looking for $name as string
   foreach($album as $id => $a) if ($a->name == $name) return intval($id);

   return false; // Found nothing
}

, чтобы дать возможность поиска как по id, так и name.Но intval() всегда будет возвращать верхний предел.Как справиться с довольно большими числами вроде, скажем, 104112826372452?Идеи?

РЕДАКТИРОВАТЬ : пример использования:

$album = $fb->createAlbum('Test Album'); // Will return album id
// The use albumExists to check if id exists
$photo1 = $fb->uploadPhoto('mypic1.png', null, $album); 
$photo2 = $fb->uploadPhoto('mypic2.png', null, 'Test Album'); // find or create

Ответы [ 5 ]

2 голосов
/ 02 декабря 2011

Если вы конвертируете в int для здравомыслия (так оно и выглядит), возможно, вы можете просто настроить его так, чтобы оно оценивалось исключительно по числовому типу вместо типа данных int:

if(ctype_digit($name) && ($found = array_key_exists($id = $name, $albums)))
      return ($found ? $id : false);
//etc

На самом деле,это тоже должно работать?

if(ctype_digit($name) && ($found = array_key_exists($name, $albums)))
      return ($found ? $name: false);
//etc
2 голосов
/ 02 декабря 2011

В качестве обходного пути вы можете использовать для этого функции gmp или bcmath.

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

Я думаю, ваша настоящая проблема - это различие с is_int().Просто используйте is_numeric() вместо него, который работает с числовыми строками произвольной длины и не зависит от целочисленных значений.

0 голосов
/ 02 декабря 2011

Один из вариантов - запустить PHP на 64bit ОС, так как размер определяется базовой операционной системой.Очевидно, что это зависит от того, можете ли вы получить доступ к 64bit оборудованию. Следует отметить, что это будет быстрее, чем использование gmp / bcmath, но если ваша цель не в том, чтобы использовать чистую скорость, это, вероятно, не будет проблемой.вы

0 голосов
/ 02 декабря 2011

К сожалению, PHP int тип может идти только до 2147483647, но PHP float может содержать целые числа до 10000000000000

Проверьте php.net http://php.net/manual/en/language.types.integer.php

ОБНОВЛЕНИЕ

PHP.net говорит, что с плавающей точкой может точно содержать целое число до 10000000000000. Я не уверен, если с плавающей точкой имеет верхний предел.

0 голосов
/ 02 декабря 2011

У int есть верхний предел, а большие числа будут представлены как floats, что является неточным и поэтому плохой идеей для использования в этой ситуации.Используйте string для хранения таких чисел и расширение BC Math , если вам нужно выполнить вычисления для него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...