为排序php数组苦苦挣扎了几天

为排序php数组苦苦挣扎了几天,php,arrays,sorting,Php,Arrays,Sorting,我已经用php数组挣扎了好几天了。 不知何故,我无法对$my_数组进行排序 我想要实现的是: 从mysql表中读取数据[有效] 将数据放在my_数组中[有效] 基于该表中的数据计算一个值,并将其添加到my_数组中[有效] 根据步骤3中的“计算”值对数组进行排序。[这次失败] 我设法做到了1到3,但没有做到第4步 下面是简化的php代码 //table contents in mysql table //--------------------- //alfa, 5, 2 //beta, 18,

我已经用php数组挣扎了好几天了。 不知何故,我无法对$my_数组进行排序

我想要实现的是:

从mysql表中读取数据[有效] 将数据放在my_数组中[有效] 基于该表中的数据计算一个值,并将其添加到my_数组中[有效] 根据步骤3中的“计算”值对数组进行排序。[这次失败] 我设法做到了1到3,但没有做到第4步

下面是简化的php代码

//table contents in mysql table
//---------------------
//alfa, 5, 2
//beta, 18, 3
//gamma, 7, 2
$q="SELECT * FROM model";
$result=mysql_query($q);
$total=mysql_numrows($result); 

$i=0;
while ($i<$total)
    {
    $modelname=mysql_result($status,$i,"modelname");
    $volume=mysql_result($result,$i,"volume");
    $force=mysql_result($result,$i,"force");

    $my_array[$i][0]=$modelname;
    $my_array[$i][1]=$volume;
    $my_array[$i][2]=$force;

    //below the calculated value what I like to sort on later in the code
    $my_array[$i][3]=$value1/$value2; /results are values like 2.5, 6, 3.5

    $i++;
}

// contents of $my_array so far:
//$i, $modelname, $volume, $force, calculated result
//---------------------
// 0, alfa, 5, 2, 2.5
// 1, beta, 18, 3, 6
// 2, gamma, 7, 2, 3.5
// now how to sort my_array on the last element [3]?
// must I use sort, usort and how to sort on this fourth value?


//epected result in my_array (sort ascending on the last element)
//first element is the index in the array (used with $i)
//---------------------
//0, alfa, 5, 2, 2.5
//1, gamma, 7, 2, 3.5
//2, beta, 18, 3, 6
下面是一个简单的代码:

$my_array = array(
    array( 'alfa', 5, 2, 2.5 ),
    array( 'beta', 18, 3, 6 ),
    array( 'gamma', 7, 2, 3.5 ),
);

usort($my_array, function($a, $b) { return $a[3] - $b[3]; });
print_r($my_array);
usort回调解释:

如手动usort回调中所述,它接受两个参数,这是$my_数组的一些项。由于$my_数组的每个项也是一个数组,因此可以使用标准语法访问数组的元素,在本例中为$a[3]

接下来,您需要返回一个比较结果。如手册所述

如果第一个参数被认为分别小于、等于或大于零,则比较函数必须返回一个小于、等于或大于零的整数 大于、等于或大于第二个

所以,减去$a[3]-$b[3]就可以做到这一点。如果$a[3]<$b[3]-减法的结果为负,否则为正,则compare函数将返回所需的结果。当然,您可以使用php手册中的示例函数编写如下内容:

function($a, $b) { return $a[3] < $b[3]? -1 : 1; }

它仍然可以工作,但是$a[3]-$b[3]也可以,并且需要更少的代码。

请去掉所有MySQL代码,并用手工创建的示例数组替换它。这意味着我们可以在我们的机器上运行您的代码,并测试修复程序是否符合您的要求。为什么不按MySQL查询对数据进行排序?splash58:因为我喜欢排序的不是数据库中数据的一部分。排序前必须进行计算。分区中$value1和$value2的确切来源是什么?我敢打赌,您可能可以在最初的SQLUSORT中实现所有这些。usort完成了这项工作,非常高兴,但老实说,在阅读usort文档时,我还不理解语法。我怀疑return$a[3]-$b[3]意味着比较数组中我想要排序的最后第三个元素的值?“我无法将您的解决方案与其中一个示例相匹配。@incognito补充了一个解释。