2016-03-05 108 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',那就是爲什麼它不起作用。我需要看到更多的代碼才能確定 –