2010-11-24 102 views
3

此代码不能正常运行,但它表明我想做的事:PHP通过索引(非关联)排序二维数组

function sort_2d_by_index($a,$i) { 
    function cmp($x, $y) { 
    // Nested function, can't find $i 
    // (global $i defeats the purpose of passing an arg) 
    if ($x[$i] == $y[$i]) { return 0; } 
    return ($x[$i] < $y[$i]) ? -1 : 1; 
    } 

    usort($a,"cmp"); 
    return $a; 
} 

,必须有一个更好的方法来做到这一点。我一直在检查ksort(),multisort(),以及各种各样的种类,直到我有点厌倦,试图将其全部整理出来。

的情况是这样的:我有一个2-d阵列...

array(
    array(3,5,7), 
    array(2,6,8), 
    array(1,4,9) 
); 

...我想列索引进行排序。说,列[1],将使这样的结果:

array(
    array(1,4,9), 
    array(3,5,7), 
    array(2,6,8) 
); 

是否有人有一个链接(我敢肯定,这已经问过),或可能会有人说:“你需要foosort,肯定”。非常感谢。

回答

7

array_multisortdocumentation中提到它可以用于这种类型的东西。让你以后整个阵列在相同的顺序排序依据列$数组进行排序

$sort_column = array(); 
foreach ($a as $row) 
    $sort_column []= $row[1]; // 1 = your example 

array_multisort($sort_column, $a); 

此同步排序两个数组:

不能避免创建仅包含一列的数组。

由于PHP 5.3,你可以通过定义你这样的cmp功能使用closure(通过$i进入功能):

$cmp = function($x, $y) use ($i) { ... }; 
+0

+1 for`use` aha这就是我正在寻找的东西,我想。 – Ben 2010-11-24 01:22:22

+0

感谢关闭链接。原来`array_multisort`解决方案是The One,直到PHP 5.3更广泛。我看了一下文档,但没有找到像这个一样好的解释。太糟糕,我不能接受两次,这个答案是伟大的:) – Ben 2010-11-24 01:42:00

1

您可以使用use访问$i

function cmp($x, $y) use ($i) { 
    // $i now available 
    if ($x[$i] == $y[$i]) { return 0; } 
    return ($x[$i] < $y[$i]) ? -1 : 1; 
}