PHP Array mit großen Zahlen

Seth93

Well-known member
ID: 322821
L
24 November 2008
1.400
82
Hallo,

ich bekomme von Facebook ein Array geliefert mit Ids, diese sind 15-stellig.
Die Daten werden dann in dem Format weiterverarbeitet: 1.0000000000000E+14
Wie kann ich die langen Ids als normale Ints weiterverarbeiten?

EDIT:
Komischerweise bekomm ich diese komischen Zahlen nur, wenn ich die Daten über die API-Methode friends.getAppUsers abrufe.
Wenn ich die Graph-API nutze mit me/friends erhalte ich die Zahlen so wie ich sie möchte.

Die Arrays sehen jedoch unterschiedlich aus:
friends.getAppUsers liefert
Array ( [0] => 100000000000)
me/friends
Array ( [data] => Array ( [0] => Array ( [name] => Name [id] => 100000000000 )))
 
Zuletzt bearbeitet:
Weiß ich nicht :/
Wenn es sich um ein 32-CPU handelt, dann müsste bei einem Überlauf die Zahl doch ins negative gehen oder?
Das kann man dann doch auch schon ausschließen.

Lg
 
Ich will mit den IDs aber nur ein paar DB-Abfragen machen.
Aber werd nochmal checken was für ein System ich genauer hab.
 
Solange die ID mit 0 endet scheint es zu funktionieren. Wenn jedoch eine andere Ziffer am Ende steht, wird die ID nicht gefunden :S

EDIT:
Hat damit wahrscheinlich doch nichts zu tun, sondern dass eine Ziffer wegfällt.
100000000000111 -> 1.0000000000011E+14
 
Zuletzt bearbeitet:
Tut mir leid, aber mit den dürftigen Infos kann man dir nicht helfen.
Wenn du die Daten aus einer externen Quellen bekommst, ist es wie immer bei PHP ein String, dem ist es egal was drinne steht. Sofern du also nicht selbst anfängst diesen in Zahlen umzuwandeln oder arithm. Operationen darauf auszuführen, ist es PHP komplett egal ob in dem String, der eine Zahl ist, ganz hinten eine 0 oder irgendetwas anderes steht.

Verwende es einfach als String weiter und du hast keine Probleme damit. Bei dir wurde die Zahl in eine Fließkommazahl umgewandelt, Fließkommazahlen sind ungenau. Der Anteil vor dem Komma ist bei 64 Bit Fließkommazahlen nur bis 2^53 genau, bei einem Float (32 Bit) noch viel früher nicht mehr.
Und wie man sieht wurde dein String bei einer mathem. Operation in eine 32 Bit Fließkommazahl (float) umgewandelt und verliert dadurch die Genauigkeit, die du vorher hattest. Du wirst also irgendwo in deinem Code eine Typ-Umwandlung ausgelöst haben.
 
Zuletzt bearbeitet:
Das ganze ist eine Funktion:
Ich frage Daten von Facebook ab.
Ich erhalte ein JSON-Array und wandel es dann mittelst json_decode() in ein PHP-Array um.
Anschließen gebe ich das Array zurück.
Findet bei json_decode eventuell eine Typ-Umwandlung statt? Wie kann ich das verhindern?

Lg
 
Ich erhalte ein JSON-Array und wandel es dann mittelst json_decode() in ein PHP-Array um.
Guck halt nach:
Ist im JSON-String deine ID noch aus lauter Ziffern oder hast du da schon Exponentialdarstellung? Falls Letzteres, musst du dich ans Gesichtsbuch wenden. Wenn Ersteres kann man weiter sehen; dann machst du nämlich deine ID selber kaputt.
 
Liegt an der Funktion json_decode().
Hab dazu auch was gefunden:
In PHP <= 5.1.6 trying to decode an integer value that's > PHP_INT_MAX will result in an intger of PHP_INT_MAX.

In PHP 5.2+ decoding an integer > PHP_INT_MAX will cause a conversion to a float.

Neither behaviour is perfect, capping at PHP_INT_MAX is marginally worse, but the float conversion loses precision.

If you expect to deal with large numbers at all, let alone in JSON, ensure you're using a 64-bit system.
https://php.net/manual/de/function.json-decode.php


EDIT:
Eine Lösung ist als 4. Parameter die Option JSON_BIGINT_AS_STRING an die Funktion zu übergeben.
 
Zuletzt bearbeitet: