如何将数据库数据插入PHP TOPSIS类的指定数组成员中?
TOPSIS类动态加载数据库数据实现方案
核心逻辑
原类中$kriteria和$alternatif两个公共属性的硬编码数据结构固定:
$kriteria单个元素结构:[指标名称, 权重值, 类型(Benefit/Cost)]$alternatif单个元素结构:[方案名称, 指标1得分, 指标2得分, 指标3得分, 指标4得分]
只需要将数据库查询结果按上述结构整理,替换构造函数中原有的硬编码array_push逻辑,即可完成数据库数据写入类属性的需求。
修改后可直接复用的代码
以下示例基于PDO数据库连接实现,仅需替换数据库连接参数、查询SQL、字段映射部分即可适配你的业务场景:
class topsis { public $alternatif = array(); public $kriteria = array(); protected $db; // 构造函数接收已初始化的数据库连接实例 public function __construct($pdoConnection) { $this->db = $pdoConnection; // 查询指标表数据,替换为你自己的kriteria表查询逻辑 $kriteriaData = $this->db->query("SELECT nama_kriteria, bobot, tipe FROM kriteria ORDER BY id_kriteria ASC")->fetchAll(PDO::FETCH_ASSOC); foreach ($kriteriaData as $k) { // 按固定结构推入kriteria属性 array_push($this->kriteria, array($k['nama_kriteria'], (int)$k['bobot'], $k['tipe'])); } // 查询方案表数据,替换为你自己的alternatif表查询逻辑 $alternatifData = $this->db->query("SELECT nama_alternatif, nilai_akademik, nilai_historis_project, nilai_pelatihan, nilai_minat FROM alternatif ORDER BY id_alternatif ASC")->fetchAll(PDO::FETCH_ASSOC); foreach ($alternatifData as $a) { // 注意:指标得分顺序必须和kriteria查询返回的顺序一一对应 array_push($this->alternatif, array( $a['nama_alternatif'], (int)$a['nilai_akademik'], (int)$a['nilai_historis_project'], (int)$a['nilai_pelatihan'], (int)$a['nilai_minat'] )); } } public function pembagi() { // 动态初始化pembagi数组,适配任意数量的指标 $this->pembagi = array_fill(0, count($this->kriteria), 0); foreach ($this->alternatif as $a) { for ($i = 0; $i < count($this->kriteria); $i++) { $this->pembagi[$i] += pow($a[$i + 1], 2); } } for ($i = 0; $i < count($this->pembagi); $i++) { $this->pembagi[$i] = round(sqrt($this->pembagi[$i]), 9); } } } // 调用示例 $pdo = new PDO('mysql:host=localhost;dbname=你的数据库名;charset=utf8mb4', '数据库用户名', '数据库密码'); $topsisInstance = new topsis($pdo); $topsisInstance->pembagi();
注意事项
- 查询
kriteria时的排序规则必须和alternatif中存储的得分字段顺序严格对应,否则TOPSIS计算结果会完全错误 - 从数据库取出的权重、得分字段要强制转为数值类型,避免返回字符串类型导致后续数学计算报错
- 如果使用mysqli而非PDO作为数据库连接驱动,仅需替换查询取数部分的语法,数组推入类属性的逻辑完全一致
- 原
pembagi方法中初始化数组写死了4个0适配4个指标,优化为按kriteria实际数量动态生成,可适配任意指标数量的场景
内容的提问来源于stack exchange,提问作者Novri Rizki Akbar
相关产品推荐
相关产品推荐

