2014-02-22 72 views
1

我正在尋找一些建議,我怎麼能按'variant_name'鍵排序這種數組。PHP按值排序巨型數組

因爲數組真的很大,我將它縮小到了查找結果狀態。

... 
    $filter[2413][1][81][sub_id] = 1; 
    $filter[2413][1][81][variant_id] = 81; 
    $filter[2413][1][81][variant_name] = 'Banana'; 

    $filter[2413][2][87][sub_id] = 2; 
    $filter[2413][2][87][variant_id] = 87; 
    $filter[2413][2][87][variant_name] = 'Apple'; 

    $filter[2413][3][32][sub_id] = 3; 
    $filter[2413][3][32][variant_id] = 32; 
    $filter[2413][3][32][variant_name] = 'Carrot'; 
    ... 

$filter[x][x][x]沒有先後順序。

我已經試過我以前使用的排序功能,但它並沒有與這種陣列的工作:

function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) { 
    $sort_col = array(); 
    foreach ($arr as $key=> $row) { 
     $sort_col[$key] = $row[$col]; 
    } 
    array_multisort($sort_col, $dir, $arr); 
} 
array_sort_by_column($filter[][][], 'variant_name'); 

我的目標是通過分揀「VARIANT_NAME」到「蘋果」,「香蕉」修改陣列,'胡蘿蔔'因此保持陣列結構。

+0

usort()是要走的路。 – goat

回答

1

這是一個從給定例子測試的工作代碼。

請注意,我的代碼仍然可以優化,只要把它作爲我的建議。

TL; DR =使用usort()

function mySort($a,$b) 
{ 
    $av = ""; 
    $bv = ""; 

    foreach($a as $ak) 
     $av = $ak['variant_name']; 

    foreach($b as $bk) 
     $bv = $bk['variant_name']; 

    if($av[0] < $bv[0]) 
     return false; 
    else return true; 
} 

如何使用它?您必須指定要排序的第一級數組。

usort($filter['2413'],"mySort"); 

然後我得到的結果是:

Array 
(
    [2413] => Array 
    (
     [0] => Array 
     (
      [87] => Array 
      (
       [sub_id] => 2 
       [variant_id] => 87 
       [variant_name] => Apple 
      ) 
     ) 

     [1] => Array 
     (
      [81] => Array 
      (
       [sub_id] => 1 
       [variant_id] => 81 
       [variant_name] => Banana 
      ) 
     ) 

     [2] => Array 
     (
      [32] => Array 
      (
       [sub_id] => 3 
       [variant_id] => 32 
       [variant_name] => Carrot 
      ) 
     ) 
    ) 
) 
+0

Craftein,[sub_id]的值與原始$ filter [filter_id] [sub_id](second)鍵不對應。 –

+0

哪裏可以解決? –

+0

我不認爲這是可能的。當你通過排序改變他們的訂單時,你不可避免地會改變他們的鑰匙。 – Craftein