2013-12-11 109 views
1

問題:PHP數組 - 由陣列外部計算值排序(最高到最低)

我需要陣列(在它們出現的陣列內的順序在符號列表中所示的內容)分類到左邊數字的順序(從最高到最低)。

這些數字對應於右側目錄路徑中的分割數(它們不存儲在當前數組中)。

我的問題出現了,因爲我不知道如何使用示例中給出的值對數組進行排序 - 因爲它們在數組之外。我嘗試過使用多維數組,但是這隻會導致更多的混淆!

由於代碼在屏幕上輸出列舉如下:

  • 6#C:\程序文件(x86)\瓦帕\ WWW \規劃器\進口\ homeworktasks
  • 5#C:\程序文件(x86)\ wamp \ www \ planner \ import
  • 7#C:\ Program Files(x86)\ Program Files(x86)\ wamp \ www \ planner \ import \ homeworktasks \ 11
  • 7# \ wamp \ www \ planner \ import \ homeworktasks \ 15
  • 7#C:\ Program Files(x86)\ wamp \ www \ planner \ import \ homeworktasks \ 17
  • 7#C:\ Program Files(x86)\ wamp \ www \ planner \ import \ homeworktasks \ 9
  • 7#C:\ Program Files(x86)\ wamp \ www \ planner \ import \ homeworktasks \ test
  • 8#C:\ Program Files文件(x86)\ wamp \ www \ planner \ import \ homeworktasks \ test \

代碼:

<?php 
//make all items in the array unique 
$dir_list = array_unique($dir_list); 
//create new array to sort into 
$dir_list_sort = array(); 
//for each item in the array 
foreach($dir_list as $dir) 
{ 
    //find depth of array 
    $dir_depth = substr_count($dir , DIRECTORY_SEPARATOR); 
    //stuff that is written to the page separated by a # 
    echo $dir_depth." # ".$dir."<br>"; 
} 
?> 
+1

把兩個值放入數組,「多維」你叫它,確實是最簡單的解決方案 - 那麼你只需要一個小小的自寫比較函數,你可以使用'usort',就完成了。 – CBroe

+0

數組的管理可能會隨着您創建數組的方式而得到改進。你可以在你生成數組的地方顯示代碼嗎? – James

+0

作爲多維數組的替代方案,具有兩個參數(計數和原始數組)的'array_multisort'自然也適用於此。這是一條線。 – Jon

回答

3

您可以使用PHP的usort()功能。 usort()「將使用用戶提供的比較函數按值排序數組。」 (PHP.net)

你必須編寫一個函數,可以比較兩個值並返回要麼-1,0或1。

<?php 

// This is just a shortcut for determining the directory depth 
function dir_depth($directory_name) 
{ 
    return substr_count($directory_name, DIRECTORY_SEPARATOR); 
} 

// Takes two values ($a and $b) and returns either -1, 0 or 1 
function compare($a, $b) 
{ 
    $depth_a = dir_depth($a); 
    $depth_b = dir_depth($b)); 

    if ($depth_a == $depth_b) { 
     // If they have the same depth, return 0 
     return 0; 
    } 

    // If depth_a is smaller than depth_b, return -1; otherwise return 1 
    return ($depth_a < $depth_b) ? -1 : 1; 
} 

// Now we can sort the array. 
// usort() needs two parameters: 
// 1. the array that will be reordered 
// 2. the name of the function that compares two values 
usort($dir_list, 'compare'); 

// Now display the list 
foreach ($dir_list as $dir) { 
    // here we can use our dir_depth() function again 
    echo dir_depth($dir) . ' # ' . $dir . '<br>'; 
} 
+0

是的,多數民衆贊成在正確的方式:) – JustAPirate

1

你不需要MUL ti維數組。一個正常的usort會做的伎倆

usort($dir_list, 'compareDirectoryDepth'); 

function compareDirectoryDepth($dir1, $dir2) { 
    $c1 = substr_count($dir1 , DIRECTORY_SEPARATOR); 
    $c2 = substr_count($dir2 , DIRECTORY_SEPARATOR); 

    return ($c1 == $c2 ? 0 : ($c1 < $c2 ? -1 : 1)); 
} 

關當然,這可以優化一下,讓substr_count稱爲少了幾分