5

タイブレーカー関数の書き方を理解しようとしています。次のレコードはすべて何らかの理由で結び付けられているため、結びつきを解消するために、各結果を並べ替えてから、各行を調べます。違いがある最初のポイントでネクタイが壊れています。

以下の例では、最初のパスで$ result [c]が削除されていますが、aとbは引き続き関連付けられています。次に、2番目のパスでaがbより大きいため、aが削除されます。したがって、結果は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 に答える