Как создать пустой ассоциативный массив в php

#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...
}