Декодируйте ваш json в массив массивов.
Используйте array_filter()
для удаления нулей.
Используйте array_values()
для переиндексации результата.
Наконец, повторно-кодировать в json.
https://3v4l.org/fgKSd
$array = json_decode('[[],[],[],[],[],[],[],[],[],[],[{"Username":"arnab@tmail.com","Role":"Software Engineer","today":"139","weekly":"391","monthly":"1149","yearly":"1149"},{"Username":"dolly@fmail.com","Role":"DevOps","today":"251","weekly":"405","monthly":"736","yearly":"736"}]]', true);
echo json_encode(array_values(array_filter($array)));
Вывод:
[[{"Username":"arnab@tmail.com","Role":"Software Engineer","today":"139","weekly":"391","monthly":"1149","yearly":"1149"},{"Username":"dolly@fmail.com","Role":"DevOps","today":"251","weekly":"405","monthly":"736","yearly":"736"}]]
Приведенное выше использование array_filter()
затем array_values()
удаляет пустые подмассивы, а затемназначает новые индексы для выходного массива (reset()
не делает то, что вам нужно).
Оптимальным решением было бы изменить дизайн вашего sql-запроса, чтобы исключить пустые результаты из запроса (с самой ранней точки),У меня такое чувство, что замена ЛЕВЫХ СОЕДИНЕНИЙ на ВНУТРЕННИЕ СОЕДИНЕНИЯ решит проблему.Кроме того, вы должны использовать псевдонимы таблиц в своем запросе, чтобы избежать перезаписи имени таблицы переменных и, как правило, улучшить краткость / читаемость кода.В качестве наилучшей практики используйте ВСЕ КАПАНЫ при написании ключевых слов mysql.
public function passing($customer, $project) {
return $this->db->query(
"SELECT t_closed_by AS Username,
iutypes.user_owner AS Role,
COUNT(CASE WHEN t_closed_time > CURDATE() - INTERVAL 1 DAY THEN 1 END) AS today,
COUNT(CASE WHEN t_closed_time > CURDATE() - INTERVAL 7 DAY THEN 1 END) AS weekly,
COUNT(CASE WHEN t_closed_time > CURDATE() - INTERVAL 1 MONTH THEN 1 END) AS monthly,
COUNT(CASE WHEN t_closed_time > CURDATE() - INTERVAL 1 YEAR THEN 1 END) AS yearly
FROM p_".$customer."_".$project."_ticket AS tickets
INNER JOIN m_event_type AS metypes ON tickets.t_req_type = metypes.ev_type
INNER JOIN ixt_user_type AS iutypes ON metypes.ev_user_type_target = iutypes.user_type
WHERE t_status = 9
GROUP BY t_closed_by"
)->result_array();
}
Если по какой-то странной причине INNER JOIN не является исправлением, вы можете использовать предложение HAVING для фильтрации строк, имеющих значение NULL, только в одном из столбцов.
К вашему сведению: нажатие на $test
может быть выполнено без вызова функции, например:
$test[] = $this->passing($value['Customer'], $value['Project']);