Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 查找值的最低组合_Php_Find - Fatal编程技术网

Php 查找值的最低组合

Php 查找值的最低组合,php,find,Php,Find,我有一张这样的桌子: Name | Skill Joe | 21 Moe | 83 Doe | 71 Noe | 44 Zoe | 67 Noe | 33 使用PHP,我想生成两个组(他们将是足球队),并找到3个技能差异最小的组合,我的意思是,根据技能点,团队应该尽可能平等 如何执行此操作?假设您的信息存储在表单的数组$info中 Array ( [0] => Array ( [name] => Joe

我有一张这样的桌子:

Name | Skill
Joe  | 21
Moe  | 83
Doe  | 71
Noe  | 44
Zoe  | 67
Noe  | 33
使用PHP,我想生成两个组(他们将是足球队),并找到3个技能差异最小的组合,我的意思是,根据技能点,团队应该尽可能平等


如何执行此操作?

假设您的信息存储在表单的数组$info中

Array
(
    [0] => Array
        (
            [name] => Joe
            [skill] => 21
        )

    [1] => Array
        (
            [name] => Moe
            [skill] => 83
        )

)
然后,您只需要取数组的笛卡尔积,忽略自比较和重复:

$skill_differences = array();
foreach ($info as $first) {
    foreach ($info as $second) {
        if (strcmp($first['name'], $second['name']) > 0) {
            $skill_differences[] = array(
              'name1'=>$first['name'],
              'name2'=>$second['name'],
              'diff'=>abs($first['skill']-$second['skill'])
            );
        }
    }
}
注意:这假设玩家的名字是唯一的。如果不是,那么您需要给每个玩家一个唯一的标识符,并用它代替
名称

然后我们可以根据玩家之间的技能差异来排列阵列:

function skill_cmp ($a, $b) {
    return $a['diff'] - $b['diff'];
}
usort($skill_differences, 'skill_cmp');

因此,三个最低技能差异配对将是
$skill\u differences
数组中的前三个元素。

为什么不按技能排序,然后对结果进行分组?我想这个问题的答案会更好/更快,我想是的,但为了确保团队的规模相同吗(最好的组合可能是两人组和三人组)?是的,大小应该相同。通常是5vs5或6vs6。