2009-11-22 12 views
6

per la creazione di un servizio mashup di Twitter. Quando ricevo i dati JSON, alcuni ID di twit sono maggiori di (che è il numero intero massimo consentito sui server a 32 bit).PHP json_decode su un server a 32 bit

Mi è venuta una soluzione che funziona, che converte gli interi in stringhe; in questo modo la funzione json_decode() non avrà alcun problema durante il tentativo di generare l'array.

Questo è ciò che ho bisogno di ottenere:

Prima (dati JSON originali)

[{"name":"john","id":5932725006},{"name":"max","id":4953467146}] 

Dopo (soluzione applicata)

[{"name":"john","id":"5932725006"},{"name":"max","id":"4953467146"}] 

sto pensando un'implementazione preg_match, ma non ho idea di come farlo a prova di proiettile. Qualsiasi aiuto sarà molto apprezzato.

risposta

12

È possibile utilizzare preg_replace per catturare i numeri e aggiungere le virgolette, qualcosa di simile:

$jsonString = '[{"name":"john","id":5932725006},{"name":"max","id":4953467146}]'; 

echo preg_replace('/("\w+"):(\d+)/', '\\1:"\\2"', $jsonString); 
//prints [{"name":"john","id":"5932725006"},{"name":"max","id":"4953467146"}] 

Prova l'esempio precedente here.

+2

Vuoi "id": "in quell'espressione, sicuramente? Altrimenti corrisponderà a qualsiasi sequenza di numeri, infrangendo gravemente qualsiasi stringa che contenga una cifra. – bobince

+0

esattamente. funziona bene ... ma sarebbe meglio se corrispondesse solo alle cifre vicino a "id": – andufo

+0

@bobnice: Accetto, modificato :) – CMS

1

Se si utilizza PHP 5.2, questi ID lunghi verranno analizzati in un float, che sebbene non sia l'ideale, fornisce almeno altri 21 bit di precisione di interi, che dovrebbero essere sufficienti per archiviare tali ID. (Ovviamente un server a 64 bit sarebbe l'ideale.)

+0

il server su cui è in esecuzione ha entrambi gli ambienti php4 e php5. per attivare php5 devo impostare questo flag nel file .htaccess: AddType application/x-httpd-php5 .php Forse questa strana impostazione non mi consente di ottenere la funzione int2float. Grazie per le informazioni però. – andufo

+0

Questo dovrebbe funzionare, ma potresti anche, ahimè, eseguire una versione precedente di PHP5. – bobince

0

Se si tratta di esso, è possibile tentare di utilizzare l'estensione PECL big_int. Ciò consente a PHP di utilizzare numeri straordinariamente grandi, se necessario. È un grande salto, ma se ti stai occupando abitualmente di numeri che rasentano il limite del mindnumbingness, probabilmente lo troverai utile.

Problemi correlati