You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将数据库数据插入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:33:15