Многомерный массив как ответ JSON

#php #mysql #arrays

#php #mysql #массивы

Вопрос:

Цель состоит в том, чтобы вернуть массив из .php в формате JSON. Этот массив должен содержать другой массив данных (49 строк DB, каждая из которых имеет 4 столбца), который берется из базы данных MySQL:

.php ниже:

 $json = array( //this is AJAX response
        "status" => null, 
        "username" => null,
        "population" => null,
        "food" => null,
        "water" => null,
        "map" => null //this to be an array of tiles
    );

$sql = "SELECT * FROM players_map_test WHERE player_id = :value";
    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(':value', $value, PDO::PARAM_INT);
    $stmt->execute();
    $result = $stmt->fetch(PDO::FETCH_ASSOC);

    foreach ($result as $row) {
        $json["map"]["tile_health"] = $row["tile_health"];
        $json["map"]["tile_id"] = $row["tile_id"];
        $json["map"]["tile_level"] = $row["tile_level"];
        $json["map"]["tile_type"] = $row["tile_type"];
    }
echo json_encode($json);
  

В моем обработчике ответов AJAX я ожидаю получить доступ к этому подмассиву как response.map и обрабатывать элементы обычным способом: response.map[0] .

Когда я console.log(ответ) Я вижу, что там присутствует map, но это не массив, и он содержит «1» в качестве значений для всех ключей:

 map:Object
    tile_health:"1"
    tile_id:"1"
    tile_level:"1"
    tile_type:"1"
  

Что я делаю не так?

Комментарии:

1. $json["map"]["tile_health"] = $row["tile_health"]; : Вы перезаписываете свои значения в цикле.

Ответ №1:

Обновите цикл foreach, как показано ниже—

 foreach ($result as $row) {
  $json["map"][] = $row;
}
  

Также измените приведенный ниже код

 #$result = $stmt->fetch(PDO::FETCH_ASSOC);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
  

fetch() Примечание: функция возвращает только 1 строку. И функция fetchAll() возвращают несколько строк.

Комментарии:

1. Это, кажется, дает некоторый результат, но, к сожалению, у меня есть только 1 строка данных вместо 49 строк. Однако идентификатор этой строки равен 49… Кажется, я снова что-то переписываю?

2. Я обновил свой ответ. Пожалуйста, проверьте мой ответ. @Vadimster

3. Или вы можете напрямую назначить $json[«map»][] = $resu< После использования fetchAll() @Vadimster

Ответ №2:

Синтаксис следующий:

 foreach ($result as $row) {
    $json["map"][] = [
        "tile_health" => $row["tile_health"],
        "tile_id" => $row["tile_id"],
        "tile_level" => $row["tile_level"],
        "tile_type" => $row["tile_type"]
    ];
}
  

Вы перезаписывали значения.

Комментарии:

1. К сожалению, получаю сообщение об ошибке «unexpected ‘[‘». Если я перейду в array(…); результат будет странным: все ключи будут иметь одинаковые значения.

2. Вы пытались использовать fetchAll вместо fetch?

3. Я на самом деле изучаю это или, в качестве альтернативы, помещаю оператор fetch() в цикл while! Я надеюсь, что это сработает. Я пропустил, что функция fetch() возвращает только один результат.

4. Этот код работал со мной: foreach ($result as $row) { $json["map"][] = array( "tile_health" => $row["tile_health"], "tile_id" => $row["tile_id"], "tile_level" => $row["tile_level"], "tile_type" => $row["tile_type"] ); }

Ответ №3:

Вы можете упростить свою часть базы данных следующим образом:

 // request only needed columns
$sql = "SELECT tile_health, tile_id, tile_level, tile_type 
        FROM players_map_test WHERE player_id = :value";

$stmt = $pdo->prepare($sql);
$stmt->bindParam(':value', $value, PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

// output was already in the type of array
$json["map"] = $result;

// encode and display
echo json_encode($json);