#php
#php
Вопрос:
Мой php-скрипт возвращает данные веб-клиенту, где они обрабатываются JavaScript.
Если данные найдены, они сохраняются в ассоциативном массиве / объекте. Если данные не найдены, я хотел бы отправить пустой ассоциативный массив.
Единственный пример, который я видел онлайн, приведен в руководстве, где вы создаете пустой класс, а затем создаете из него экземпляр объекта.
Ниже приведен мой код и результаты, которые он выдает на стороне веб-клиента
$sql = 'select job, client, project from jobs j left join client c on c.key = j.cKey where j.key='.$this->p['reckey'];
if ( $result = $db->query($sql) )
{
if ($result->num_rows > 0)
{
$l = mysqli_fetch_all( $result, $resulttype = MYSQLI_ASSOC );
$this->res_array['info'] = $l[0];
}else{
$this->errors[] = 'No such job # '.$this->p['reckey'];
$this->res_array['info']=[];
}
}else{
$this->errors[] = 'Query failed!';
$this->res_array['info']=[];
}
$this->res_array['errors'] = $this->errors;
echo json_encode ($this->res_array);
Вот два примера того, как выглядят данные, когда они поступают на веб-клиент, прежде чем они будут декодированы с помощью JSON. Обратите внимание на разницу в элементе «info».
ответ {«info»:{«job»: «999», «client»: «My Company, Inc.», «project»: «Этот проект»},»errors»:[]}
ответ на ошибку {«info»:[ ],»errors»:[«Нет такого задания # 0»]}
В успешном ответе у меня есть объект / ассоциативный массив, где я бы использовал
for (variable in object) {...}
В пустом ответе я просто получаю стандартный массив [] в квадратных скобках, где я бы использовал
for (step = 0; step < info.length; step ) {}
Это происходит, конечно, потому что я указываю пустой массив в приведенном выше php-коде.
Мой вопрос прост, как я могу изменить свой php-код, чтобы передавался пустой ассоциативный массив?
Ответ №1:
Единственный пример, который я видел онлайн, приведен в руководстве, где вы создаете пустой класс, а затем создаете из него экземпляр объекта.
Похоже, вы ответили на свой собственный вопрос!
Поскольку в JavaScript объект и ассоциативный массив — это, по сути, одно и то же, все, что вам нужно сделать, это заменить эту строку:
$this->res_array['info']=[];
С помощью этого:
$this->res_array["info"] = new StdClass;
Или, если вы хотите внести изменения только перед отправкой ответа, вы могли бы проверить наличие пустого информационного массива и заменить его пустым классом.
if(!count($this->res_array["info"]))
$this->res_array["info"] = new StdClass;
Комментарии:
1. Идеальный ответ. Пример, который я видел онлайн, был более подробным. Ваш простой «новый стандартный класс» был именно тем, что я искал. Спасибо
Ответ №2:
Я бы предложил использовать лучшее из обоих миров и позволить PHP генерировать массив ассоциативных массивов, даже если вы ожидаете максимум одного, но, по крайней мере, вы будете использовать ту же структуру, когда у вас ее нет.
Итак, измените:
$this->res_array['info'] = $l[0];
Для:
$this->res_array['info'] = $l;
А затем в JavaScript выполните:
for (var step = 0; step < info.length; step ) {
for (variable in info[step]) {
// ...
}
}
… и если вам все еще нужно, вы можете разобраться с условием отсутствия данных отдельно в JavaScript. Что-то вроде:
if (errors.length) {
// deal with this case...
}