4

2 つのテーブルがあります: dt_timesdt_reports

dt_timesには時間のリストが含まれ、dt_reportsには関連する時間に対する投票 (賛成/反対) が含まれます。

私のコードは次のことを行います:

  • 今日より前のすべての時間を選択
  • それらの時間ごとに - マージンを計算します((positive-negative)/positive)*100
  • 結果は配列に格納されます

すべての反復の後、これが id => margin の var_dump です

array(8) {

    [111]=> int(100)
    [110]=> int(-100)
    [108]=> int(-100)
    [100]=> int(100)
    [97]=> int(100)
    [92]=> int(100)
    [59]=> float(-71.4285714286)
    [58]=> float(-50)

 }

IDも最高である最高のマージンを選択する必要があります。111、100、97、92 はすべて同じ値の 100 であることがわかるからです。

今までの私のコードはこれでした:

while ($row = mysql_fetch_array($result)) {

    //Get values for quality
    //calculate margin
    $arr[$row['id']] = $margin;
    $arr2[$margin] = $row['id'];

}

$timeId = $arr2[max($arr)];

ただし、すべてのループの後、$timeId は 92 です。これは、値が 100 の配列内の最後の ID です。

array_keys が答えかもしれないと思いますが、私の人生の愛のために、私はそれらを理解できませんでした =(

4

3 に答える 3

3

結果の配列をkrsort(http://us.php.net/manual/en/function.krsort.php )を使用してキーで並べ替えます。最初の要素として、最も高い値を持つ最も高いキーを返します。

  <?php
   $a = array(10 => 10, 20=>10, 20=>20);
   krsort($a);
   var_dump($a);

  ?>
于 2012-10-09T15:09:25.577 に答える
1

usort()カスタム比較関数で使用する適切な配列を作成することで、これを行うことができます。コードは次のとおりです。

function cmp($a, $b) {
    if ($a['id'] == $b['id']) {
        if ($a['margin'] == $b['margin']) {
           return 0;
        }
        return ($a['margin'] > $b['margin']) ? -1 : 1;
    }
    return ($a['id'] > $b['id']) ? -1 : 1;
}

while ($row = mysql_fetch_array($result)) {
    //calculate $margin
    //...
    $arr[] = array('margin'=>$margin ,'id'=>$row['id']);
}

usort($arr, 'cmp');

echo 'The highest id with the highest margin is';
echo ' ID: ' . $arr[0]['id'] . ' MARGIN: ' . $arr[0]['margin'];

//Print full sorted classification
foreach($arr as $val) {
   echo 'ID:' . $val['id'] . ' MARG: ' . $val['margin'] . '<br>';
}

このソリューションでは、id で並べ替え$arrられ、マージンが最高から最低になるため、最初のアイテム$arr[0]が最高の ID とマージンになり、残りの配列をループして、最高のアイテムだけでなく、並べ替えられたテーブル全体を出力できます。

于 2012-10-09T15:33:13.270 に答える
1

配列http://us.php.net/manual/en/function.max.phpの最大値を取得することから始めて、配列を反復処理し、その最大値に一致するマージンを持つキーを見つけます。

$arr = array();
while ($row = mysql_fetch_array($result)) {
    //Get values for quality
    //calculate margin
    $arr[$row['id']] = $margin;
}

$max = max($arr);
$highestId = 0;
foreach($arr as $id => $margin){
  if($margin == $max && $id > $highestId){
    $highestId = $id;
  }
}
于 2012-10-09T15:28:57.290 に答える