2016-03-05 109 views
1

我有一个由4个字段组成的数组。使用GET变量对数组进行排序..没有排序

$retval[] = array(
     "name" => "$dir$entry/", 
     "type" => filetype("$dir$entry"), 
     "size" => 0, 
     "lastmod" => filemtime("$dir$entry") 
    ); 

我要排序此阵列取决于变量,它包含任一4区域的1(例如:类型,名称等)

$sortBy = $_GET['sortBy']; 

这个函数应使用$ sortBy变量:

function compare_field($a, $b){ 
return strnatcmp($a["'.$sortBy.'"], $b["'.$sortBy.'"]) 
} 

,被称为是这样的:

usort($retval, "compare_field"); 

但是建设不起作用..

希望有人能指出我在正确的方向,是我明显的newby。

回答

3

首先,您按键排序的实际上是:'..',而不是$sortBy的值。您试图使用变量值作为关键,要做到这一点,您不需要引用引号,只需编写$arrayName[$keyVariable]即可。而已。
其次是compare_field无法访问$sortBy变量。该变量是创建它的范围的局部变量,或者它是全局变量。无论哪种方式,功能都无法访问它。

如果你想usort回调可以访问$sortBy变量,最简单的方法是使用一个闭包(匿名函数)回调:

usort($retval, function ($a, $b) use ($sortBy) { 
    return strnatcmp($a[$sortBy], $b[$sortBy]); 
}); 
+0

有趣。感谢您的意见。我试过你的解决方案,但$ sortBy仍然没有使用。如果我替换为“名称”它可以工作,但是当我使用$ sortBy时,没有任何反应。并且$ sortBy的名字是相同的... – Sam

+0

我使用旧代码工作,但确实没有引号,并且使$ sortBy成为全局的。像你指出的范围问题的东西..但显然你的解决方案仍然有范围问题?好奇你对它的想法.. – Sam

+0

'$ sortBy'需要在与你调用'usort'相同的范围内可用。除非声明该函数的地方有权访问此变量,否则不能将'$ sortBy'传递给匿名函数。如果你在全局函数(即函数或方法)以外的范围调用'usort',那就是为什么它不起作用。我需要看到更多的代码才能确定 –