
本文介绍如何在从数据库循环构建多维关联数组时,精准跳过未初始化的子数组(如 `$profissionais_1` 或 `$profissionais_2` 为空时),避免生成含 `null` 键或空结构的无效条目,确保最终 json 输出紧凑、语义清晰。
在 PHP 中处理数据库查询结果并按类型分组构建嵌套数组时,一个常见陷阱是:当某类数据(如 id_tipo_profissional = 2)在当前查询中完全不存在时,对应变量(如 $id_tipo_profissional_2、$profissionais_2)未被赋值,保持为 null。此时若直接将其写入数组(如示例中 $id_tipo_profissional_2 => [...]),PHP 会将 null 转为字符串 "" 作为键名,并填充 null 值,导致输出中出现冗余的 "": { ... } 条目。
✅ 正确做法是:仅在相关数据实际存在且非空时,才向目标数组中追加该子结构。推荐使用显式条件判断(而非依赖 array_filter()),因为 array_filter() 默认仅过滤 值(value),无法解决因键(key)为 null/空字符串引发的结构污染问题。
以下是优化后的完整实现逻辑:
// 初始化主容器与子数组(显式声明,提升可读性与健壮性)
$profissionais_1 = $profissionais_2 = [];
$id_tipo_profissional_1 = $id_tipo_profissional_2 = null;
$tipo_profissional_1 = $tipo_profissional_2 = null;
while ($row = $stm->fetch()) {
if ($row['id_tipo_profissional'] == '1') {
$id_tipo_profissional_1 = $row['id_tipo_profissional'];
$tipo_profissional_1 = $row['tipo_profissional'];
$profissionais_1[] = [
'id_profissional' => $row['id'],
'nome' => ucwords($row['nome'] . ' ' . $row['sobrenome'])
];
} elseif ($row['id_tipo_profissional'] == '2') {
$id_tipo_profissional_2 = $row['id_tipo_profissional'];
$tipo_profissional_2 = $row['tipo_profissional'];
$profissionais_2[] = [
'id_profissional' => $row['id'],
'nome' => ucwords($row['nome_do_escritorio'])
];
}
}
// ✅ 动态构建 'tipo' 数组:仅添加已初始化且非空的类别
$tipo = [];
if (!empty($id_tipo_profissional_1) && !empty($profissionais_1)) {
$tipo[$id_tipo_profissional_1] = [
'id_tipo_profissional' => $id_tipo_profissional_1,
'nome_tipo_profissional' => $tipo_profissional_1,
'profissionais' => $profissionais_1
];
}
if (!empty($id_tipo_profissional_2) && !empty($profissionais_2)) {
$tipo[$id_tipo_profissional_2] = [
'id_tipo_profissional' => $id_tipo_profissional_2,
'nome_tipo_profissional' => $tipo_profissional_2,
'profissionais' => $profissionais_2
];
}
$resultado = ['tipo' => $tipo];
return json_encode($resultado, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);? 关键说明:
立即学习“PHP免费学习笔记(深入)”;
- 使用 !empty() 同时校验 $id_tipo_profissional_X(确保类型 ID 存在)和 $profissionais_X(确保至少有一个专业人员),避免仅 ID 存在但无数据的“空壳”条目;
- 显式初始化所有变量(如 $profissionais_1 = []),防止未定义变量警告(E_NOTICE);
- json_encode() 添加 JSON_UNESCAPED_UNICODE 确保中文字符正常显示,JSON_UNESCAPED_SLASHES 避免斜杠转义,提升 JSON 可读性。
? 进阶建议:若类型数量可能扩展(如支持 3, 4…),可考虑用配置驱动方式重构,例如预定义类型映射表,配合 foreach + 闭包统一处理,进一步提升代码可维护性与扩展性。
通过以上方式,即可彻底消除 "": { ... } 类冗余节点,输出严格符合业务预期的精简 JSON 结构。











