本文目录导读:

在PHP项目中实现正交实验(Orthogonal Experiment),通常不是为了做纯数学的正交表生成(这需要组合数学算法),而是为了辅助测试或分析——即您已经有一个正交表(比如常用的L9、L16等),然后用PHP来管理实验用例、分配参数、生成组合、或分析结果。
以下是几种常见的实现思路和方法:
核心概念(PHP中如何理解)
正交实验 = 用最少的实验次数覆盖最多因素组合。
在PHP中,您通常需要:
- 定义因素(如:浏览器、操作系统、屏幕尺寸)
- 定义水平数(每个因素有几个值)
- 选择一个合适的正交表
- 生成实验用例行
方案一:手动硬编码正交表(最常用)
如果您只需要一个固定的正交表(如L9(3^4)),直接写PHP数组是最简单的方式。
<?php
// L9(3^4) 正交表:4个因素,每个3个水平,9个实验
$orthogonalTable = [
[1,1,1,1],
[1,2,2,2],
[1,3,3,3],
[2,1,2,3],
[2,2,3,1],
[2,3,1,2],
[3,1,3,2],
[3,2,1,3],
[3,3,2,1]
];
$factors = [
'浏览器' => ['Chrome', 'Firefox', 'Edge'],
'操作系统' => ['Windows', 'macOS', 'Linux'],
'屏幕尺寸' => ['小', '中', '大'],
'网络速度' => ['慢', '中', '快']
];
// 生成实验用例
echo "正交实验用例列表:\n";
foreach ($orthogonalTable as $row => $levels) {
echo "实验 #" . ($row+1) . ": ";
$i = 0;
foreach ($factors as $factorName => $levels_values) {
echo "$factorName: " . $levels_values[$levels[$i]-1] . " | ";
$i++;
}
echo "\n";
}
?>
输出示例:
实验 #1: 浏览器: Chrome | 操作系统: Windows | 屏幕尺寸: 小 | 网络速度: 慢
实验 #2: 浏览器: Chrome | 操作系统: macOS | 屏幕尺寸: 中 | 网络速度: 中
...
适用场景:因素和水平固定,快速测试。
方案二:动态正交表生成器(算法实现)
如果您需要自动生成任意因素数/水平数的正交表,需要实现算法(如 Taguchi 方法)。
1 简单的纯素数幂构造法(仅适用于相同水平数且为素数幂的情况)
<?php
function generateOrthogonalTable($numFactors, $numLevels) {
// 限制:只支持素数幂水平数,且 numFactors <= numLevels + 1
if (!isPrime($numLevels) && !isPrimePower($numLevels)) {
return false; // 非素数幂无法用此简单方法
}
$rows = pow($numLevels, 2); // L_n^2 表
$table = [];
for ($i = 0; $i < $rows; $i++) {
$row = [];
for ($j = 0; $j < $numFactors; $j++) {
// 线性构造法(简化版)
$row[] = ($i + $j) % $numLevels + 1;
}
$table[] = $row;
}
return $table;
}
function isPrime($num) {
if ($num < 2) return false;
for ($i = 2; $i * $i <= $num; $i++) {
if ($num % $i == 0) return false;
}
return true;
}
function isPrimePower($num) {
if ($num < 2) return false;
$primes = [2,3,5,7,11,13,17,19,23,29,31];
foreach ($primes as $p) {
$temp = $num;
while ($temp % $p == 0) {
// 检查是否完全由该素数构成
}
}
return false; // 简化判断,实际需实现完整检测
}
// 使用示例
$table = generateOrthogonalTable(4, 3);
print_r($table);
?>
⚠️ 注意:真正的正交表生成是组合数学的难题,生产环境建议使用预编译表库或调用外部工具(如Python的
pyDOE2库生成的CSV)。
2 推荐:使用预计算表库(最实用)
预先下载一份标准正交表(如从互联网或书籍中),保存为 JSON 或数据库表:
{
"L4_2_3": {
"description": "4次实验,3因素2水平",
"table": [[1,1,1],[1,2,2],[2,1,2],[2,2,1]]
},
"L9_3_4": {
"description": "9次实验,4因素3水平",
"table": [[1,1,1,1],[1,2,2,2],...]
}
}
然后在PHP中读取并使用:
$orthoData = json_decode(file_get_contents('tables.json'), true);
$table = $orthoData['L9_3_4']['table'];
方案三:集成到测试框架(实际项目应用)
如果您在做一个参数自动化测试工具,可以这样设计:
class OrthogonalTestRunner {
private $factors;
private $testCases;
public function __construct($factors, $orthogonalTableFile = null) {
$this->factors = $factors;
// 从数据库/文件加载正交表
$this->loadTable($orthogonalTableFile);
}
public function runTests(callable $testFunction) {
foreach ($this->testCases as $case) {
$params = $this->mapLevelsToValues($case);
$result = $testFunction($params);
$this->logResult($params, $result);
}
}
private function mapLevelsToValues($rowLevels) {
$params = [];
$i = 0;
foreach ($this->factors as $name => $valuesList) {
$params[$name] = $valuesList[$rowLevels[$i]-1] ?? $valuesList[0];
$i++;
}
return $params;
}
}
// 使用
$factors = [
'api_version' => ['v1', 'v2', 'v3'],
'auth_type' => ['none', 'basic', 'oauth2'],
'payload_size' => ['small', 'medium', 'large']
];
$tester = new OrthogonalTestRunner($factors, 'L9.json');
$tester->runTests(function($params) {
// 实际测试逻辑
echo "Testing: api={$params['api_version']}, auth={$params['auth_type']}\n";
});
技术选型建议
| 需求场景 | 推荐方案 |
|---|---|
| 快速静态测试 | 手动数组 + L9/L16等标准表 |
| 因素数/水平数变化 | 预存正交表库 + 自动匹配 |
| 需要在线生成任意表 | 调用R/Python生成CSV,PHP读取 |
| 大规模自动化测试 | 数据库存储表 + 状态机控制执行 |
需要注意的陷阱
- 水平数不匹配:正交表的水平数必须与因素的实际水平数一致,如果实际水平数少于正交表水平数,可以混用(将一些水平设为“无关”)。
- 因素数超出:一个正交表可以支持的因素数有限,例如L9只能支持4个因素,多的因素会被忽略。
- 交互作用:如果需要分析因素间的交互(AB、AC等),需要选择更大的正交表(如L27)。
扩展:PHP + 统计分析
正交实验通常还需要做极差分析或方差分析(ANOVA),可以用PHP的统计库:
// 计算每个水平下结果的平均值(极差分析)
function rangeAnalysis($experimentResults, $orthogonalTable, $factors) {
// 按因素/水平分组计算均值
// 找出影响最大的因素(极差最大)
}
不过更常见的做法是:PHP负责生成用例 + 执行测试,将结果导出CSV后用Python/R做统计分析。
在PHP项目中实现正交实验的核心是:
- 表驱动:预定义正交表(数组/JSON/数据库)
- 映射替换:将表的数字水平映射为实际参数值
- 循环执行:对每一行执行测试逻辑
不需要自己实现复杂的正交表生成算法——那是统计学家的领域,PHP最适合做调度者和结果收集器。