Есть рабочий sql-запрос, по которому надо составить JSON:
$sql = "SELECT recipes.id, recipes.title_ru as 'title', detail_recipes.idIngredient,
ingredients.title_ru as 'title' FROM recipes
LEFT JOIN detail_recipes ON recipes.idRecipe = detail_recipes.idRecipe
LEFT JOIN ingredients ON detail_recipes.idIngredient = ingredients.id";
Результат запроса на картинке:
Мы имеем три таблицы и у каждого рецепта есть определенное количество ингредиентов, которые берутся из остальных таблиц. Список ингредиентов нужно вывести как объект
Необходимо получить json в виде:
{
"id":1,
"title": "Американские блины",
"ingredients": [
{
"idIngredient":1,
"title":"Молоко"
},
{
"idIngredient":20,
"title":"Куриное яйцо"
},
{
"idIngredient":27,
"title":"Сахар"
},
...
]
"id":2,
"title": "Сырники из творога",
"ingredients": [
{
"idIngredient":13,
"title":"Творог"
},
{
"idIngredient":20,
"title":"Куриное яйцо"
},
{
"idIngredient":27,
"title":"Сахар"
},
...
]
}
Как это правильно вывести на языке php? Вот что есть:
if (!$result = $mysqli->query($sql)) {
echo "Error!";
echo "\nQuery: " . $sql . "\n";
echo "ErrorNo: " . $mysqli->errno . "\n";
echo "Error: " . $mysqli->error . "\n";
exit;
}
if ($result->num_rows === 0) {
echo "Result is empty";
exit;
}
$data = array();
while($row = $result->fetch_assoc()) {
$data[] = $row;
}
echo json_encode($data,JSON_UNESCAPED_UNICODE);
Но результат выводит этот:
[
{
"id":"1",
"title":"Американские блины",
"idRecipe":"1"
},
{
"id":"2",
"title":"Сырники из творога",
"idRecipe":"2"
}
]
Спасибо за помощь.
Ну во-первых, я не знаю как вам СуБД вернула 2 одинаковых поля, но пхп такое точно объединит, поэтому первое что надо сделать, переименовать второй title
в IngredientTitle
. В запросе: ingredients.title_ru as 'IngredientTitle'
$array = [
0 => array(
'id' => '1',
'title' => 'TITLE 1',
'idIngredient' => '15',
'IngredientTitle' => 'Ingredient 1',
),
1 => array(
'id' => '1',
'title' => 'TITLE 1',
'idIngredient' => '26',
'IngredientTitle' => 'Ingredient 2',
),
2 => array(
'id' => '2',
'title' => 'TITLE 2',
'idIngredient' => '11',
'IngredientTitle' => 'Ingredient 3',
),
];
$result = array();
//while($value = $result->fetch_assoc()) {
foreach ($array as $value)
{
$result[$value['id']]['id'] = $value['id'];
$result[$value['id']]['title'] = $value['title'];
$result[$value['id']]['ingredients'][] = ['idIngredient' => $value['idIngredient'], 'title' => $value['IngredientTitle']];
}
var_dump(json_encode(array_values($result), JSON_UNESCAPED_UNICODE));
Результат будет таков:
[
{
"id":"1",
"title":"TITLE 1",
"ingredients":[
{
"idIngredient":"15",
"title":"Ingredient 1"
},
{
"idIngredient":"26",
"title":"Ingredient 2"
}
]
},
{
"id":"2",
"title":"TITLE 2",
"ingredients":[
{
"idIngredient":"11",
"title":"Ingredient 3"
}
]
}
]
Запросом получаешь массив с данными.
А массив передаешь в функцию json_encode($data)
.
Пример:
oci_execute($stid, OCI_NO_AUTO_COMMIT);
$data= array();
while(($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) !== FALSE) {
//тут второй запрос по ингридиентам
//...
while(($row2 = oci_fetch_array($stid2, OCI_ASSOC+OCI_RETURN_NULLS)) !== FALSE) {
$row['ingredients'] = $row2;
}
$data[] = $row;
}
oci_cancel($stid);
echo @json_encode($data)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Не выходит прикрепить изображение к посту в группеПо порядку: определяю путь к пикче, передаем в метод getWallUploadServer айди группы без минуса и токен
Делаю инструмент для удобства работы с неким сторонним сайтом, на одном из этапов столкнулся с проблемой, при авторизации через CURL, на стороннем...
У меня есть скрипт, мне нужно чтоб он срабатывал два раза в деньКак на php написать, чтоб этот скрипт так работал?