2010-04-23 169 views
0

我正在用一組數據庫字段構建一個數組,其中包含有關表,實際字段名稱和描述性字段名稱的信息作爲多維數組。下面是它目前的樣子:PHP中的多維數組值排序

$Fields['User']['ID'] = "User ID"; 
$Fields['User']['FirstName'] = "First Name"; 
$Fields['Stats']['FavouriteOrder'] = "Favourite Item Ordered"; 
$Fields['Geographic']['Location'] = "Current Location"; 
$Fields['Geographic']['LocationCode'] = "Current Location Code"; 

好了,這是好的,但我通過不同層次的管道到這一點,允許出口的選定字段的系統,並在結束時,我想的foreach() ,提取數據,然後最終將所有描述性字段顯示爲使用其描述性名稱按字母順序排序。所以最終的順序是:當前位置,當前位置代碼,收藏夾項目排序,名字然後用戶ID - 顯然保持索引關聯。

我不能使用usort(),我不能使用array_multisort()...或者我可以,我只是不知道如何。 usort()似乎需要一個鍵排序,但我有可變鍵。 array_multisort()看起來和sort()真的一樣。

+0

你在哪裏存儲結構中的值? – 2010-04-23 15:28:06

+0

這些值是引號中的項目...我基本上將描述與特定表中的特定字段相關聯。 – David 2010-04-23 15:30:55

+0

對不起,我被字段名稱和值混淆了,你能發表一個你預期的最終輸出的例子嗎? – 2010-04-23 15:34:06

回答

0

這僅適用於2D陣列。沒有代碼的最優雅的一塊,我已經寫了,但它的作品...

foreach($Fields as $key=>$var) { 
     ksort($var); 
     $Fields[$key]=$var; 
    } 
    ksort($Fields); 
+0

嗯馬諾斯,我試過你的建議,看到我即將發表的文章:) – David 2010-04-23 15:14:56

0

讓我寧願給現實生活中的數據例如,而不是假的數據,因爲假數據混淆接近我。所以,假數據被評論。

/* 
$Fields['User']['ID'] = "User ID"; 
$Fields['User']['FirstName'] = "First Name"; 
$Fields['Stats']['FavouriteOrder'] = "Favourite Item Ordered"; 
$Fields['Geographic']['Location'] = "Current Location"; 
$Fields['Geographic']['LocationCode'] = "Current Location Code"; 
*/ 

$Fields['Product']['ReferenceNumber'] = "Product Reference Number"; 
$Fields['Product']['Halaal'] = "Halaal Status"; 
$Fields['Product']['Kosher'] = "Kosher Status"; 
$Fields['Product']['KosherType'] = "Kosher Type"; 
$Fields['Product']['CuringSalts'] = "Curing Salts Status"; 
$Fields['Product']['ProductVisibility'] = "Product Visibility"; 
$Fields['Product']['ProductStatus'] = "Product Status"; 
$Fields['Product']['PackBarCode'] = "Barcode"; 
$Fields['Product']['ProductDescription'] = "Product Description"; 
$Fields['Pack']['PackSize'] = "Pack Size"; 
$Fields['Pack']['PackSizeNumeric'] = "Numeric Pack Size"; 
$Fields['Allergens']['ContainsNuts'] = "Product Contains Nuts"; 


foreach ($Fields as $key => $value) { 
    ksort($value); 
    $Fields[$key] = $value; 
} 
ksort($Fields); 
我有「的」星期五...的print_r($域)的一個

表明,鍵進行排序和價值有關,但它仍然通過按鍵,而不是最終值排序。

這幾乎就像我需要一個反向排序系統,該系統首先會檢查所有值,將它們排序,然後說,「好吧,你在哪裏屬於......啊,你屬於FieldX表Y」

我希望有是一種偷偷摸摸的聰明的方式來做到這一點,也許有,但我想我會寫一個函數來解析數據,寫一個反轉的數組,然後按照價值順序重寫原始。低效率,但它會。

儘管如此,仍然有更好的建議!

0

好吧,它根本不算優雅。所以我不鼓勵使用它,並會尋找更好的方式。但是,我已經得到了解決上述和下面的例子的解決方案。

不幸的是,我希望它的方式是,數組必須包含前面的「排序」數字,所以我認爲這是我一開始就失敗的。但它現在起作用了。

$TempDescArray = array(); 
$TempFieldArray = array(); 
$TempTableArray = array(); 
$Pointer = 0; 

foreach ($Fields as $Table => $FieldsArray) { 
    foreach ($FieldsArray as $Field => $Description) { 
     $TempDescArray[$Pointer] = $Description; 
     $TempFieldArray[$Pointer] = $Field; 
     $TempTableArray[$Pointer] = $Table; 
     $Pointer++; 
    } 
} 

asort($TempDescArray); 
$Fields = array(); 
$Pointer2 = 0; 

foreach ($TempDescArray as $Pointer => $Description) { 
    $Fields[$Pointer2][$TempTableArray[$Pointer]][$TempFieldArray[$Pointer]] = $Description; 
    $Pointer2++; 
} 
0

我真的要工作了這一點,昨天的一個項目我工作 - 這裏是我的代碼:

資源陣列看起來像這樣:

$resource[$count]['title'] 
$resource[$count]['filepath'] 
$resource[$count]['filename'] 
$resource[$count]['taxonomy'][0] 

一對夫婦的排序功能按標題排序ASC or DESC

function compare_asc($a, $b) { 
    return strcmp($a['title'], $b['title']); 
} 
function compare_desc($a, $b) { 
    if ($a['title'] == $b['title']) { 
     return 0; 
    } 
    return ($a['title'] > $b['title']) ? -1 : 1; 
    //return strcmp($a['title'], $b['title']); 
} 

最後使用usort在你做廁所之前做髒通過$資源並輸出任何你需要的東西。

usort($resource, "compare_asc");