Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP json_encode as object after PHP array unset()

Tags:

I'm experiencing odd behavior with json_encode after removing a numeric array key with unset. The following code should make the problem clear. I've run it from both the CLI and as an Apache mod:

PHP version info:

C:\Users\usr\Desktop>php -v PHP 5.3.1 (cli) (built: Nov 20 2009 17:26:32) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies 

PHP Code

<?php  $a = array(     new stdclass,     new stdclass,     new stdclass ); $a[0]->abc = '123'; $a[1]->jkl = '234'; $a[2]->nmo = '567';  printf("%s\n", json_encode($a)); unset($a[1]); printf("%s\n", json_encode($a)); 

Program Output

C:\Users\usr\Desktop>php test.php [{"abc":"123"},{"jkl":"234"},{"nmo":"567"}] {"0":{"abc":"123"},"2":{"nmo":"567"}} 

As you can see, the first time $a is converted to JSON it's encoded as a javascript array. The second time around (after the unset call) $a is encoded as a javascript object. Why is this and how can I prevent it?

like image 652
leepowers Avatar asked Oct 06 '10 02:10

leepowers


People also ask

What does the PHP function json_encode () do?

The json_encode() function is used to encode a value to JSON format.

How can I get JSON encoded data in PHP?

To receive JSON string we can use the “php://input” along with the function file_get_contents() which helps us receive JSON data as a file and read it into a string. Later, we can use the json_decode() function to decode the JSON string.

What does json_encode return?

Syntax. The json_encode() function can return a string containing the JSON representation of supplied value. The encoding is affected by supplied options, and additionally, the encoding of float values depends on the value of serialize_precision.

How do you create an array of objects ready to be encoded as a JSON string?

Creating an Array of JSON Objects We can create an array of JSON object either by assigning a JSON array to a variable or by dynamically adding values in an object array using the . push() operator or add an object at an index of the array using looping constructs like the for loop or while loop.


2 Answers

In addition to the array_values technique it is possible to use array_splice and remove an element and re-index in one step:

unset($a[1]); 

Instead:

array_splice($a, 1, 1); 
like image 20
leepowers Avatar answered Sep 25 '22 05:09

leepowers


The reason for that is that your array has a hole in it: it has the indices 0 and 2, but misses 1. JSON can't encode arrays with holes because the array syntax has no support for indices.

You can encode array_values($a) instead, which will return a reindexed array.

like image 136
zneak Avatar answered Sep 24 '22 05:09

zneak