0

mysql fetch array ループ内で構築する配列があります。この配列には、次のような値が含まれます。

Array ( [0] => 1 Hour: 1.6
        [1] => 2 Hour: 2.3
        [2] => 3 Hour: 2.8
        [3] => 4 Hour: 3.7
        [4] => 8 Hour: 7.0 )

Array ( [0] => 2 Hour: 1.5
        [1] => 4 Hour: 2.9
        [2] => 8 Hour: 3.8
        [3] => 12 Hour: 5.0
        [4] => 24 Hour: 8.9 )

特定の期間で最も安い価格を並べ替える最良の方法は何ですか。1 時間を選択しても、2 番目の 2 時間が最も安いものとして返されます。

これをさらに複雑にするために、配列には次のものが含まれる場合があります。

Array ( [0] => Free )

getPrice(duration) 関数を使用してクラスを作成することを考えていました。ループ内でこれの新しいインスタンスを宣言し、グローバル配列へのポインターを追加してから、最終的にこのグローバル配列の各アイテムをループして最も安いものを見つけます。このソリューションは実行可能ですか? またはより良い代替手段はありますか?

while($row = mysql_fetch_array($results))
{
    $price = explode(';', $row['price']);
    print_r($price);
}

ありがとう

4

1 に答える 1

2

これらの値が PHP に返される前に、データベースでソートする必要があります。Web サーバーで追加の作業を行う必要はありません。

「FREE」値については、ORDER BY 操作が正しく機能するように、MySQL を使用して値を 0 にします。

編集:

ここでDBパラダイムを話し合って微調整するより良い解決策があると思いますが、彼が望んでいるタイプの回答でOPを黙認して提供することにしました(提供された最小限の情報で、これはおそらく近いと思います) :

$aData = array(
        array(
            '1 Hour: 1.6',
            '2 Hour: 2.3',
            '3 Hour: 2.8',
            '4 Hour: 3.7',
            '8 Hour: 7.0'),
        array(
            '2 Hour: 1.5',
            '4 Hour: 2.9',
            '8 Hour: 3.8',
            '12 Hour: 5.0',
            '24 Hour: 8.9'),
        array(
            '2 Hour: Free',
            '4 Hour: 5.9',
            '8 Hour: 3.5',
            '12 Hour: 6.0',
            '24 Hour: 7.9'),
        );


$aCheapest = array();

// iterate all rows
foreach($aData as $aInfo) {
    // iterate row items
    foreach($aInfo as $aRow) {
        // parse the duration and rate
        list($sRawDuration, $fRate) = explode(': ', $aRow);

        $iDuration = (int)str_replace(' Hour', '', $sRawDuration);
        if(strtolower($fRate) == 'free')
            $fRate = 0.0;
        else
            $fRate = (float)trim($fRate);

        // potentially update the cheapest rate for a duration
        if(!isset($aCheapest[$iDuration]))
            $aCheapest[$iDuration] = $fRate;
        else
            $aCheapest[$iDuration] = min($aCheapest[$iDuration], $fRate);
    }
}

var_dump($aCheapest);

出力:

array(7) {
  [1]=>
  float(1.6)
  [2]=>
  float(0)
  [3]=>
  float(2.8)
  [4]=>
  float(2.9)
  [8]=>
  float(3.5)
  [12]=>
  float(5)
  [24]=>
  float(7.9)
} 
于 2012-07-12T19:10:39.470 に答える