5

我试图弄清楚如何编写一个决胜局函数。以下记录都因某种原因而平局,因此为了打破平局,我们对每个结果进行排序,然后遍历每一行。平局在第一点就被打破了,这是有区别的。

在下面的示例中,第一遍 $result[c] 被淘汰,但 a 和 b 仍然并列。然后在第二次通过时,a 被消除,因为它大于 b。所以结果是 b, a, c

$result[a] = array(1, 3, 4, 5);
$result[b] = array(1, 2, 3, 7);
$result[c] = array(2, 3, 3, 5);

更复杂的是,我不会总是有相同数量的结果来比较。它可能超过 2 个。

我真的希望这是有道理的。

4

3 回答 3

3

在php中,实际上可以直接使用关系运算符比较数组

if ($result['a'] > $result['b']) {

}

php 只会循环遍历子数组,比较它们的元素。如果您想阅读http://php.net/manual/en/language.operators.comparison.php ,还有更多详细信息

无论如何,您可以利用这一点并对其进行排序。

asort($result);
print_r($result);

如果您需要一种方法来获得第 n 个位置条目,请执行

asort($result);
print_r($result);
$ranked = array_keys($result);
$secondPlace = $ranked[1]; // a
print_r($result[$secondPlace]);

如果你需要一封信的排名指数

$letterRanks = array_flip($ranked);
echo $letterRanks['a']; // 1, for second 
于 2012-06-02T19:27:09.227 回答
0
$i = 0;
while (count($result) > 1) {
   $winners = array();
   $best = PHP_INT_MAX;
   foreach ($result as $x) {
      if ($x[$i] == $best) {
         $winners[] = $x;
      } else if ($x[$i] < $best) {
         $winners = array($x);
         $best = $x[$i];
      }
   }
   $i++;
   $result = $winners;
}

这只是一段快速而肮脏的代码......它不能处理数组大小不同的情况。主要是因为我不确定 array(1,2,3) 或 array(1,2) 中的哪一个应该“获胜”。此外,它不会进行任何数组边界检查或处理在比较所有元素之后绑定多个数组的情况。

于 2012-06-02T19:17:42.130 回答
0

这是一个有效的解决方案。如果您需要更好地解释它的工作原理,请告诉我。我已将调试语句留在其中,因此您应该能够辨别它在做什么。该解决方案适用于任意数量的竞争者,只要它们$num_elements在每个数组中都相同。

$result = array();
$result['a'] = array(1, 3, 4, 5);
$result['b'] = array(1, 2, 3, 7);
$result['c'] = array(2, 3, 3, 5);

$num_elements = 4; // In each array
$num_competitors = count( $result);

$finish_order = array();
$keys = $winners = array_keys( $result);

// $i is the current index into each competitor's array
// $j is the current index into the $keys array (telling us the current competitor)
// $k is the next index into the $keys array (telling us the next competitor, i.e. the competitor to compare the current competitor with)
for( $i = 0; $i < $num_elements; $i++) {

    // If we've eliminated all but one winner, we're done!
    if( count( $winners) == 1) { 
        $finish_order[] = array_pop( $winners);
        break;
    }

    echo 'Element number ' . $i . "\n";

    for( $j = 0; $j < $num_competitors; $j++) {

        // If we've already eliminated this competitor, continue;
        if( !isset( $winners[$j])) continue;

        for( $k = $j + 1; $k < $num_competitors; $k++) {

            // If we've already eliminated this competitor, continue;
            if( !isset( $winners[$k])) continue;

            echo "\t - Who wins: " . $result[ $keys[$j] ][$i] . ' from ' . $keys[$j] . ' or ' . $result[ $keys[$k] ][$i] . ' from ' . $keys[$k] . "?\n";

            if( $result[ $keys[$j] ][$i] < $result[ $keys[$k] ][$i]) {

                echo "\t\t *** " . $keys[$k] . ' is out!' . "\n";
                $finish_order[] = $keys[$k];                
                unset( $winners[$k]);
            }

            if( $result[ $keys[$j] ][$i] > $result[ $keys[$k] ][$i]) {

                echo "\t\t *** " . $keys[$j] . ' is out!' . "\n";
                $finish_order[] = $keys[$j];                
                unset( $winners[$j]);
            }

        }
    }
}

echo "Game over - Result order is: " . implode( ', ', array_reverse( $finish_order));

输出:

Element number 0
     - Who wins: 1 from a or 1 from b?
     - Who wins: 1 from a or 2 from c?
         *** c is out!
Element number 1
     - Who wins: 3 from a or 2 from b?
         *** a is out!
Game over - Result order is: b, a, c

演示

于 2012-06-02T20:53:46.613 回答