PHP превращает объект в массив массива

0

У меня есть 3 таблицы, после присоединения имени и вывода роли с этим

$encoded = array();
while($res = mysqli_fetch_assoc($result)) {
    echo json_encode($res);
}

Я получил это

{"student_id":"1","student_name":"john","score_id":"1","score_type":"E","score_name":"England"}
{"student_id":"1","student_name":"john","score_id":"2","score_type":"B","score_name":"Brazil"}

Теперь я изо всех сил стараюсь превратить их в формат, который мне нужен, клиентский сайт должен иметь это

//json
[{
"student_id":"1",
"student_name":"john",
"scores": [{
        "score_id":"1",
        "score_type":"E",
        "score_name":"England"
    },{
        "score_id":"2",
        "score_type":"B",
        "score_name":"Brazil"
    }]
}]

Задача состоит в том, что он дублировал строку с одним и тем же человеком.

Теги:
mysqli

2 ответа

1

Обработайте выход, используя Array $encoded и после его создания вы можете распечатать его с помощью JSON.

В этом решении массив будет проиндексирован student_id и оценками score_id. В случае студента это необходимо, в случае баллов рекомендуется:

$encoded = array();
while($res = mysqli_fetch_assoc($result)) {
  // Student details
  $encoded[$res['student_id']] = array(
      'student_id' => $res['student_id'],
      'student_name' => $res['student_name'],
  );
  // Student score details
  $encoded[$res['student_id']]['scores'][$res['score_id']] = array(
      'score_id' => $res['score_id'],
      'score_type' => $res['score_type'],
      'score_name' => $res['score_name'],
  );
}
echo json_encode($encoded);

Примечание. Это общий ответ, так как я не знаю точной структуры ваших данных в $ res.

  • 0
    @GlobinHughes Я обновил код, чтобы отразить ваши пост обновления.
0

Пожалуйста, найдите приведенный ниже код, чтобы получить формат json, как указано в вашем вопросе

$students = [];
$sampleData    = [
          [

              "student_id"=>"1",
              "student_name"=>"john",
              "score_id"=>"1",
              "score_type"=>"E",
              "score_name"=>"England",
          ],
          [
              "student_id"=>"1",
              "student_name"=>"john",
              "score_id"=>"2",
              "score_type"=>"B",
              "score_name"=>"Brazil",
          ],
];
foreach ($sampleData as $res) {

    //if student not found by id then continue
    if (empty($res['student_id'])) {
        continue;
    }

    $student = [];
    //get the already exists student to add scores
    if(!empty($students[$res['student_id']])) {
       $student = $students[$res['student_id']];
    }


    //prepare the student array
    $student['student_id']             = $res['student_id'];
    $student['student_name']           = $res['student_name'];
    $student['scores'][]['score_id']   = $res['score_id'];
    $student['scores'][]['score_type'] = $res['score_type'];
    $student['scores'][]['score_name'] = $res['score_name'];

    $students[$res['student_id']] = $student;
}

echo json_encode(array_values($students));

надеюсь это поможет

Вы можете найти рабочий пример здесь

  • 0
    можно избежать этой линии? $arr = $students[$res['contact_id']] ?? []; Я пока не использую php 7.
  • 0
    ваш ответ не работает, я попробовал, я дал мне 2 массива
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню