PHP-如何根据条件配对数组中的项目

mvd*_*rio 8 php arrays

如何配对数组中的项目?假设我有一系列战士.我想根据他们的重量配对它们.最接近重量的战斗机应配对为最佳匹配.但如果他们在同一个团队中,他们就不应该配对.

  • **---第1队 - **
  • 战斗机A重量是60
  • 战士B的重量是65
  • ** - 第2队 - **
  • 战斗机C重量是62
  • 战斗机D重量是60
  • ** - 第3队 - **
  • 战斗机E重量是64
  • 战斗机F重量是66

输出:

  • 战斗机VS战斗机D.
  • 战斗机B VS战斗机F.
  • 战斗机C VS战斗机E.

我一直在研究这个主题,发现了类似但不完全的东西: 随机但独特的配对,有条件

非常感谢一些帮助.提前致谢!

Mad*_*iha 5

我非常喜欢您的问题,所以我做了一个完整的版本。

<?php

    header("Content-type: text/plain");
    error_reporting(E_ALL);

    /**
     * @class            Fighter
     * @property $name   string
     * @property $weight int
     * @property $team   string
     * @property $paired Fighter  Will hold the pointer to the matched Fighter
     */
    class Fighter {
        public $name;
        public $weight;
        public $team;
        public $paired = null;

        public function __construct($name, $weight, $team) {
            $this->name   = $name;
            $this->weight = $weight;
            $this->team   = $team;
        }
    }

    /**
     * @function sortFighters()
     *
     * @param $a Fighter
     * @param $b Fighter
     *
     * @return int
     */
    function sortFighters(Fighter $a, Fighter $b) {
        return $a->weight - $b->weight;
    }

    $fighterList = array(
        new Fighter("A", 60, "A"),
        new Fighter("B", 65, "A"),
        new Fighter("C", 62, "B"),
        new Fighter("D", 60, "B"),
        new Fighter("E", 64, "C"),
        new Fighter("F", 66, "C")
    );
    usort($fighterList, "sortFighters");

    foreach ($fighterList as $fighterOne) {
        if ($fighterOne->paired != null) {
            continue;
        }
        echo "Fighter $fighterOne->name vs ";
        foreach ($fighterList as $fighterTwo) {
            if ($fighterOne->team != $fighterTwo->team && $fighterTwo->paired == null) {
                echo $fighterTwo->name . PHP_EOL;
                $fighterOne->paired = $fighterTwo;
                $fighterTwo->paired = $fighterOne;
                break;
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)
  1. 首先,将战斗机放在班级中,这样可以更轻松地为他们分配属性(如果您自己还没有这样做,我敦促您这样做!)
  2. 组成一系列战斗机,并为其分配名称,重量和团队。
  3. 按权重对数组进行排序(使用usort()和排序功能sortFighters()按每个元素的weight属性进行排序。
  4. 遍历数组并根据以下条件进行匹配:
    1. 战斗机一尚未匹配
    2. 第二战斗机与第一战斗机不在同一个团队中
    3. 第二战斗机尚未匹配
  5. 找到匹配项后,将每个匹配的战斗机的对象指针相互存储(因此它不再为null,此外,您还可以访问来访问每个战斗机对$fighterVariable->paired
  6. 最后,打印结果。