Je dois envoyer des données en utilisant JSON dans une structure comme celle-ci:
$joutput=json_encode($JSONDATA,JSON_NUMERIC_CHECK); echo $joutput;
NOTE: la variable $ content est un tableau associatif dynamique, donc sa taille n'est pas constante. La sortie JSON est envoyée en utilisant le système classique:
$JSONDATA= array( 'response' => true, 'error' => null, 'payload' => array( 'content' => $content, 'size' => $size ) );
La question est: comment puis-je évaluer dynamiquement la variable $ size et l'inclure dans la sortie?
3 Réponses :
Partie 1. Si cela ne fonctionne pas pour vous, je mettrai à jour la réponse après votre prochaine erreur.
$test_1 = memory_get_usage(); $content = array('key'=>'value'); $size = memory_get_usage() - $test_1; $JSONDATA= array( 'response' => true, 'error' => null, 'payload' => array( 'content' => $content, 'size' => $size ) );
Eh bien Giorgi, je vous remercie beaucoup pour votre réponse intéressante, je l'ai essayé et j'obtiens un résultat mais malheureusement les chiffres sont faux. En d'autres termes, si je mesure la sortie à l'aide de l'inspecteur Chrome, j'obtiens 664 caractères (ou octets), mais en utilisant votre méthode, je n'obtiens que 227 octets ... un indice?
vous pouvez l'utiliser pour calculer la taille de $ content
( DEMO ) :
$size = mb_strlen(json_encode($content, JSON_NUMERIC_CHECK), '8bit');
Cela vous fournira toute la longueur de la chaîne json_encode ()
d de $ content
. Si vous souhaitez calculer la taille en octets (si vous utilisez des caractères multi-octets), cela peut être plus utile ( DEMO ) :
$size = strlen(json_encode($content, JSON_NUMERIC_CHECK));
Cela a bien fonctionné, @ mega6382! Voici ma solution: $ t = mb_strlen (json_encode ($ JSONDATA, JSON_NUMERIC_CHECK), '8bit'); $ JSONDATA ['payload'] ['size'] = $ t + strlen ($ t);
Le résultat est parfait!
vient de mentionner votre excellente solution dans mon dernier message. Votre solution est maintenant acceptée!
Je suppose que cela sera utile pour beaucoup d'autres, j'ai donc décidé de répondre à ma propre question en utilisant la solution @ mega6382:
// prepare the JSON array $JSONDATA= array( 'response' => true, 'error' => null, 'payload' => array( 'content' => $content, 'size' => $size ) ); // evaluate the JSON output size WITHOUT accounting for the size string itself $t = mb_strlen(json_encode($JSONDATA, JSON_NUMERIC_CHECK), '8bit'); // add the contribution of the size string and update the value $JSONDATA['payload']['size']=$t+strlen($t); // output the JSON data $joutput=json_encode($JSONDATA,JSON_NUMERIC_CHECK); echo $joutput;
Vous ne pouvez pas intégrer de manière fiable la taille d'une chaîne dans la chaîne en tant que chaîne car ces données changeront la longueur de la chaîne et la longueur de la chaîne changera ces données. Utilisez plutôt l'en-tête HTTP
Content-Length:
.ce n'est pas si @Sammitch. Voir ma solution ci-dessous.