Я хочу преобразовать выбранный результат в JSON. Вот мой код:
<?php
include("DbConnect.php");
$connection=new DbConnect();
$sth = mysqli_query($connection->_con,"SELECT * FROM account WHERE ac_id='1'");
if($sth){
$rows = array();
while($row = mysqli_fetch_assoc($sth)){
$users = mysqli_query($connection->_con,"SELECT user.user_id,user.name,user.email,ac_detail.ac_id,ac_detail.amount FROM user,ac_detail WHERE ac_detail.ac_id='1' AND user.user_id=ac_detail.user_id");
$usersArray = array();
while($userRow = mysqli_fetch_assoc($users)){
$usersArray[]=$userRow;
}
$a=array("users"=>$usersArray);
//$row["user"]=$usersArray
array_push($row,$a);
$rows[] = $row;
}
echo json_encode(array('data'=>$rows));
}else{
echo json_encode(array('message'=>'error - 2'));
}
?>
Выполняя этот код, он генерирует JSON как:
{"data":[{"ac_id":"1","user_id":"2","title":"Travel","ac_for":"Traveling","required_amount":"50","current_amount":"0","initial_date":"2014-11-11","final_date":"2014-11-14","is_shared":"1","status":"1","0":{"users":[{"user_id":"2","name":"Muhammad Imran","email":"[email protected]","ac_id":"1","amount":"0"},{"user_id":"3","name":"Muhammad Imran","email":"[email protected]","ac_id":"1","amount":"0"}]}}]}
Но я не хочу "0" {"user ::...}
Как это должно быть (ожидаемые результаты):
{"data":[{"ac_id":"1","user_id":"2","title":"Travel","ac_for":"Traveling","required_amount":"50","current_amount":"0","initial_date":"2014-11-11","final_date":"2014-11-14","is_shared":"1","status":"1","users":[{"user_id":"2","name":"Muhammad Imran","email":"[email protected]","ac_id":"1","amount":"0"},{"user_id":"3","name":"Muhammad Imran","email":"[email protected]","ac_id":"1","amount":"0"}]}]}
заранее спасибо
Почему бы вам вместо array_push($row,$a)
попробовать:
<?php
include("DbConnect.php");
$connection=new DbConnect();
$sth = mysqli_query($connection->_con,"SELECT * FROM account WHERE ac_id='1'");
if($sth){
$rows = array();
while($row = mysqli_fetch_assoc($sth)){
$users = mysqli_query($connection->_con,"SELECT user.user_id, user.name, user.email, ac_detail.ac_id, ac_detail.amount FROM user,ac_detail WHERE ac_detail.ac_id='1' AND user.user_id=ac_detail.user_id");
$usersArray = array();
while($userRow = mysqli_fetch_assoc($users)){
$usersArray[]=$userRow;
}
// here comes the change
// $a = array("users"=>$usersArray);
// //$row["user"]=$usersArray
// array_push($row,$a);
$row['users'] = $usersArray;
$rows[] = $row;
}
echo json_encode(array('data'=>$rows));
}else{
echo json_encode(array('message'=>'error - 2'));
}
Это должно сработать. Не проверяйте данные образца.
Ты делаешь:
while($row = mysqli_fetch_assoc($sth)){
[...snip...]
array_push($row,$a);
Строка while
создает массив $row
, который затем используется для создания $a
. Затем вы нажимаете этот $a
BACK на исходный массив $row
. Но $row
- это ассоциативный массив, поэтому нажатие клавиши $a
получает ключ 0.
Поскольку теперь вы смешиваете ассоциативный массив (нечисловые ключи) с массивом с числовым ключом (операция push), PHP ДОЛЖЕН добавить числовой ключ к вашему нажатому элементу: вы не можете иметь элемент в массиве БЕЗ ключ.
Тогда, поскольку JS не позволяет фактическим массивам JS ([]
) иметь нечисловые ключи, вся вещь должна быть преобразована в объект ({}
).
То, что вы, вероятно, хотите, это нечто большее:
while($row = ...) {
... build $a ...
array_push($row['users'], $a);
вместо.