Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

php json_encode is encoding the same data twice

Tags:

json

php

I am getting some data from a database and am encoding it to json:

$json = "";
if($result = $dbc->query($query)) {
    $num = $result->num_rows;
    for($i = 0; $i < $num; $i++) {
        $row = $result->fetch_array();
        $json .= json_encode($row);
        if($i != ($num-1)) {
        $json .= ',';
        }
    }
}

but instead of getting the json string in the format:

{"name:"joe", "age":"22", "etc":"etc"}

I'm getting every value duplicated because it is giving me the element name as being both the index of an associative and non-associative array. So I'm getting:

{"0":"joe", "name":"joe", "1":"22", "age":"22", "3":"etc", "etc":"etc"}

While I can still use the json. It is still twice the size that I want it to be and so not efficient. Is there anyway I can get the json_encode method to just give me the associative array inices as the json tags? (Wrong words to describe these things no doubt)

Many thanks

like image 467
Joe Avatar asked Jan 11 '11 21:01

Joe


3 Answers

This is because you are using fetch_array() (emphasis mine):

mysqli_fetch_array() is an extended version of the mysqli_fetch_row() function. In addition to storing the data in the numeric indices of the result array, the mysqli_fetch_array() function can also store the data in associative indices, using the field names of the result set as keys.

Use fetch_assoc() instead.

like image 95
Pekka Avatar answered Sep 27 '22 21:09

Pekka


Pekka is probably right, but I would like to add that you are making more work for yourself by calling json_encode() for every row. It's probably better to build your data structure, and then call json_encode() on that:

$rows = array();
if ($result = $dbc->query($query)) {
    $num = $result->num_rows;
    for ($i = 0; $i < $num; $i++) {
        $rows[] = $result->fetch_assoc();
    }
}
$json = json_encode($rows);

Marking as community wiki as this is a suggestion on practice and not an answer.

like image 31
ken Avatar answered Sep 27 '22 19:09

ken


Just change $row = $result->fetch_array(); to $row = $result->fetch_assoc();

like image 31
Valera Leontyev Avatar answered Sep 27 '22 21:09

Valera Leontyev