PHP数组排序方式不同

时间:2012-05-04 22:20:29

标签: php

我从MYSQL db导出了我放在数组中的不同信息:

$info=array(
(ID,CALORIES,PROTEIN,CARBOS,FIBER),
...
);
ex: (1,270,24,12,5),(2,280,2,42,10),...

然后,在脚本的下方,我需要获得3个卡路里最高的产品的ID,5个图表中最高结果为2xPROTEIN + 3xCARBOS等的6个产品的ID。

如何对数组进行这样的排序以填充我的不同表?

函数sort()似乎只适用于单维数组(如果它适用于我的情况,我不知道语法是什么)。它似乎也不适合我更高级的排序(2 * x + 3 * y)......

4 个答案:

答案 0 :(得分:3)

即使这不是你要求的,我强烈建议你在mysql中准备你的表(使用所有公式进行排序等)。 Mysql的主要工作是做各种选择和排序,我会为此留下工作。而且,mysql中的高级排序比思考php中的算法或函数更容易:)

SELECT * FROM `products`
ORDER BY (2*PROTEIN+3*CARBOS) DESC

这很容易,没有头痛。在最后应用LIMIT 3以获得前3个。更新

SELECT * FROM `products`

到更高级的查询。如果在代码中遇到困难,您可以尝试将其包装为子查询:

SELECT * FROM (SELECT * FROM `products` WHERE `type`='fruit' LIMIT 6) a
ORDER BY (2*PROTEIN+3*CARBOS) DESC LIMIT 3

答案 1 :(得分:1)

您可以使用array_multisort()对多维数组进行排序。语法允许相当灵活,请参阅the reference

答案 2 :(得分:1)

您可以使用usort功能:

function cmp( $a, $b )
{ 
  if(  $a["calories"] *3+ $a["protein"]*2 ==   $b["calories"] *3+ $b["protein"]*2){ //do another comparison etc.. ; } 
  return ($a["calories"] *3+ $a["protein"]*2<   $b["calories"] *3+ $b["protein"]*2)) ? -1 : 1;
} 
usort($myarray,'cmp');

答案 3 :(得分:1)

usort是你的朋友。

function sort2Protein3Carbo($a, $b)
{
    // Assuming protein is the 2nd value in your array and carbo the 3rd.
    $resA = 2 * $a[2] + 3 * $a[3];
    $resB = 2 * $b[2] + 3 * $b[3];

    if ($resA == $resB)
        return 0;

    return ($resA < $resB) ? -1 : 1;
}

usort($info, "sort2Protein3Carbo");