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
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.
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.
Just change $row = $result->fetch_array();
to $row = $result->fetch_assoc();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With