我有一个数组,是在 mysql 获取数组循环中构造的。该数组包含以下值:
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 )
对给定时间段内最便宜的价格进行排序的最佳方式是什么,因此,如果我选择一小时,我仍然会返回第二个两小时作为最便宜的价格。
为了进一步复杂化,数组有时可能包含:
Array ( [0] => Free )
我正在考虑创建一个带有 getPrice(duration) 函数的类,在循环中我将声明一个新实例并添加一个指向全局数组的指针,最后循环遍历此全局数组中的每个项目以查找最便宜的。这个解决方案可行吗?或者有更好的选择吗?
while($row = mysql_fetch_array($results))
{
$price = explode(';', $row['price']);
print_r($price);
}
谢谢
最佳答案
您应该在这些值返回 PHP 之前在数据库中进行排序,无需在 Web 服务器上进行额外的工作。
对于“FREE”值,只需使用 MySQL 将它们变为 0,以便 ORDER BY 操作正常工作。
编辑:
虽然我觉得可能有更好的解决方案来讨论和调整数据库范例,但我决定默许并提供他所追求的答案类型的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)
}
关于php - 按数组值排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11458754/