Как установить все значения на false в массиве?

У меня есть такой код:

$iterator = 0;
while (($end = $sth->fetch()) && $iterator < 2)
{
$api_arr["data"]['tc'][] =  $end["tc"];
$api_arr["data"]['em'][] =  $end["em"];
$api_arr["data"]['sg'][] =  $end["sg"];

$iterator ++;
}

Я создаю API своего сайта для других разработчиков. Я даю им вывод в формате JSON. Что-то вроде этого:

{
-data{
tc: [
"value_tc_1",
"value_tc_2",
"value_tc_3"],

em: [
"value_em_1",
"value_em_2",
"value_em_3"],

sg: [
"value_sg_1",
"value_sg_2",
"value_sg_3"]
}
}

Токовый выход: (когда нет никаких строк $sth->rowCount() == '')

[]

Что я хочу: (когда нет никаких строк $sth->rowCount() == '')

{
-data{
tc: [false],
em: [false],
sg: [false]
}
}

Ну, как я могу это сделать?


В качестве консультации: это обязательно установить false как значения массива, когда нет результата? У меня никогда не было опыта создания API. Я хочу установить false в соответствии с некоторыми похожими API (с других сайтов).

На самом деле я хочу представить стандарт и пригодный для использования другими разработчиками. Итак, что я делаю правильно, как API? Другие разработчики смогут его использовать?

Я не знаю, может быть, мне нужно вот что:

{
-data{
tc: false,
em: false,
sg: false
}
}

Вообще есть ли какой-то момент, который мне нужно знать? {Заранее спасибо :)}


Что я пробовал: Я думаю, что-то вроде этого будет полезно, но на самом деле я не знаю, как мне это использовать:

array_fill_keys(array_keys($api_arr['data']), "false");

-3

Решение

Инициировать массив с пустыми значениями:

$iterator = 0;
$api_arr = [
'data'=>
[
'tc'=>[],
'em'=>[],
'sg'=>[]
]
];

while (($end = $sth->fetch()) && $iterator < 2)
{
$api_arr["data"]['tc'][] =  $end["tc"];
$api_arr["data"]['em'][] =  $end["em"];
$api_arr["data"]['sg'][] =  $end["sg"];

$iterator ++;
}

Если в базе данных нет результатов, результат будет:

{
data{
tc: [],
em: [],
sg: []
}
}

Что будет соответствовать потребителям API, которые ожидают структуру данных, содержащую массивы. Вероятно, вся структура может быть реорганизована, но последовательность — хорошее начало

Расширить на "the whole structure can be refactored"Часть, глядя на данные, кажется, что значения логически сгруппированы в базе данных (строка содержит связанные tc, em а также sg ячеек), но вы разделяете их в API без четкой причины.

Лучшая структура будет следовать структуре базы данных:

$iterator = 0;
$data = [];
while (($end = $sth->fetch()) && $iterator < 2)
{
$data[] =  [
'tc'=> $end["tc"],
'em'=> $end["em"],
'sg'=> $end["sg"]
];
$iterator ++;
}
header('Content-Type: application/json');
echo json_encode([data=>$data]);

Это выведет:

{
data:[
{tc: value_tc_1, em: value_em_1, sg: value_sg_1},
{tc: value_tc_2, em: value_em_2, sg: value_sg_2},
{tc: value_tc_3, em: value_em_3, sg: value_sg_3}
]
}

Когда у вас есть результаты, и:

{
data:[]
}

Когда нет результатов.

Код потребителя может быть, например, (снова используя php, может быть любым языком):

 $response = json_decode(file_get_contents($apiEndpoint));
foreach($response->data as $element){
echo '<tr><td>' . $element->tc . '</td><td>' . $element->em . '</td><td>' . $element->sg . '<td></tr>';
}

И независимо от того, возвращает ли ваш API результаты или нет, потребительский код работает нормально (просто показывает пустую таблицу, если результатов нет).

В заключение, если ваш SQL более конкретен в том, что вы хотите, например:

SELECT tc, em, sg FROM tablename LIMIT 3

Тогда весь ваш PHP-код становится:

header('Content-Type: application/json');
echo json_encode([data=>$sth->fetchAll()]);

Нет необходимости в итераторе, цикле и т. Д.

3

Другие решения

Возврат объекта ошибки сохраняет согласованность и легко поддается отслеживанию на стороне клиента:

Скажем, вы вернете это, если данные не найдены:

$api_arr["error"]["code"] = 404;
$api_arr["error"]["message"] = "No data found";

Теперь на стороне клиента, в запросе ajax кто-то может легко сделать это:

try {
if(typeof ajaxObj.error != 'undefined'){
throw ajaxObj.error;
}

//Data is found
} catch(errObj) {
//Handle the error object.
}
1