PHP以指定字段为索引返回数据库所取的数据数组
介绍一种在PHP中将数据库查询结果按指定字段重组为二维数组的方法,以便快速关联基础配置与统计数据,简化报表逻辑。
场景与目标
在开发后台报表时,常需将静态配置数据(如站点列表)与动态统计数据(如各站点流量)结合展示。直接通过复杂的 LEFT JOIN 或内存拼接可能导致逻辑繁琐且难以维护。通过自定义函数,将 SQL 结果集按照特定字段作为键名进行重组,可以极大地简化前端循环遍历和数据获取的逻辑。
准备条件
假设我们需要实现一个网站流量统计后台,涉及以下两张核心数据表:
- 站点配置表 (site_config):
存储需要监控的网站基本信息。由于读操作远大于写操作,使用 MyISAM 引擎。
CREATE TABLE `site_config` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`sid` smallint(5) unsigned NOT NULL COMMENT '网站ID',
`site_url` varchar(128) NOT NULL COMMENT '网站URL地址',
`site_name` varchar(80) NOT NULL COMMENT '网站名称',
`add_time` timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `adid` (`sid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- 站点流量统计表 (site_stat):
记录每一次访问行为,包含IP和访问时间。由于写操作频繁,使用 InnoDB 引擎。
CREATE TABLE `site_stat` (
`id` int(11) unsigned NOT NULL auto_increment,
`sid` smallint(5) unsigned NOT NULL COMMENT '网站ID',
`ip_address` varchar(32) NOT NULL COMMENT '用户IP',
`add_time` timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
真实操作顺序
第1步:构建以指定字段为索引的查询结果处理函数
目的:封装数据库查询后的数据整理逻辑,支持两种模式:保持原序的二维数组,或以指定字段为键名的关联数组。
入口:传入 SQL 语句及可选的索引字段名。
重要参数:
$sql: 执行的查询语句。$filed: 可选。若为空,则返回普通索引数组;若存在,则以该字段的值作为数组的键。
protected function getList($sql, $field = null) {
// 注意:mysql_* 系列函数已废弃,实际项目中建议使用 PDO 或 MySQLi
$res = mysql_query($sql, $this->link_sc);
$data = array();
if ($field === null) {
// 未指定索引字段,保持原有顺序
while ($row = mysql_fetch_assoc($res)) {
$data[] = $row;
}
} else {
// 指定索引字段,将该字段值作为 key
while ($row = mysql_fetch_assoc($res)) {
$data[$row[$field]] = $row;
}
}
return $data;
}
完成状态:函数返回一个二维结构的数据集合。
第2步:分别获取配置列表与统计数据
目的:独立查询基础配置和统计数据,避免在数据库层面进行复杂的多表关联,减轻数据库压力。
动作:
- 获取所有站点配置:无需指定索引字段,因为需要在 PHP 层按 ID 匹配。
- 获取当日流量统计:查询时将
sid作为索引字段传入,这样后续可以直接通过站点 ID 快速获取对应流量。
// SQL1: 取所有站点
$sql1 = "SELECT sid, site_url, site_name FROM site_config";
$sites = getList($sql1); // 返回普通二维数组
// SQL2: 取今日站点流量统计
$sql2 = "SELECT sid, COUNT(1) AS come_total
FROM site_stat
WHERE add_time >= '2013-06-30 00:00:00'
AND add_time <= '2013-06-30 23:59:59'
GROUP BY sid";
$stats = getList($sql2, 'sid'); // 返回以 sid 为 key 的关联数组
第3步:组装报表数据
目的:遍历基础配置列表,从关联数组中提取对应的统计数据。对于没有流量的站点,统计数组中不存在该键,从而实现默认值(如0)的输出。
动作:使用 foreach 循环 $sites,并在内部查找 $stats 中对应 sid 的数据。
foreach ($sites as $site) {
$sid = $site['sid'];
// 如果 stats 中存在该 sid,则获取流量数,否则默认为 0
$traffic = isset($stats[$sid]) ? $stats[$sid]['come_total'] : 0;
echo $site['site_url'] . " 流量: " . $traffic . "<br>";
}
完成判断
最终输出的报表应包含所有配置的站点,无论其是否有流量记录。例如:
- baidu.com 流量: 3
- google.com 流量: 0 (无记录,显示为0)
- cnblogs.com 流量: 3
此方法确保了“有流量显示流量,无流量显示0”的需求,且代码逻辑清晰,易于维护。
简要总结
通过分离查询与组装逻辑,利用 PHP 数组特性建立映射关系,是处理此类报表需求的简洁方案。上述关于 PHP 以指定字段为索引返回数据库所取的数据数组的详细内容,更多关于 PHP 数据库优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













