2014-03-19 75 views
0

我幾乎要離開我了 - 我希望你能幫助;也許這很簡單,但我現在很困難。如何根據multidim數組在php中對multidim數組進行排序?

我有數組的下無序數組:

$variations_excerpt = 
Array ([4288] => Array ([pa_farbe] => white-default [pa_groesse] => xl) 
     [128] => Array ([pa_farbe] => black-default [pa_groesse] => s) 
     [130] => Array ([pa_farbe] => black-default [pa_groesse] => xxl) 
     [4289] => Array ([pa_farbe] => white-default [pa_groesse] => xxl) 
     [127] => Array ([pa_farbe] => black-default [pa_groesse] => m) 
     [129] => Array ([pa_farbe] => black-default [pa_groesse] => xl) 
     [4286] => Array ([pa_farbe] => [pa_groesse] =>) 
     [149] => Array ([pa_farbe] => black-default [pa_groesse] => l) 
     [4287] => Array ([pa_farbe] => white-default [pa_groesse] => s) 
     [126] => Array ([pa_farbe] => black-default [pa_groesse] => l) 
     [4290] => Array ([pa_farbe] => white-default [pa_groesse] =>)) 

(我並不想強調這一點,但請注意,在它周圍灑空值(=「」),它的意思。 )

另一個注意事項:在一些奇怪的情況下,有可能存在doublettes。在這個例子中確實存在:

... 
[126] => Array ([pa_farbe] => black-default [pa_groesse] => l) 
... 
[149] => Array ([pa_farbe] => black-default [pa_groesse] => l) 
... 

我認爲提前回答'doublette問題'很重要。 )

-

現在,這種無序陣列上方需要根據以下數組進行排序,提供所有的值的期望的順序。我已經成功地使這個:

$unique_attribute_values = 
Array ([pa_farbe] => Array ([0] => black-default [1] => white-default [2] =>) 
     [pa_groesse] => Array ([5] => s [6] => m [7] => l [8] => xl [9] => xxl [10] =>)) 

(空值(=「」)被移動接近年底)

此外,我已經知道,有多少「尺寸」這樣的陣列將擁有和什麼是他們的 '名字',屬性:

$dim = 0; 
$dim_names = array(); 
foreach ($unique_attribute_values as $attr => $val) { 
    $dim++; 
    $dim_names[$dim] = $attr; 
    } 

...導致:

$dim = 2; 
$dim_names = Array ([1] => pa_farbe 
        [2] => pa_groesse) 

請注意:這個例子中的'維度'是2 - 但是維度可以從1變化到n(在實踐中n幾乎總是< 4)。但是由於它是未知的,我認爲確定維度並提供可用的名稱(=鍵)是一個好主意,可能爲未來的for-loop。 (?)

-

無論如何,我需要達到的效果是:

$ordered_excerpt = 
Array ([128] => Array ([pa_farbe] => black-default [pa_groesse] => s) 
     [127] => Array ([pa_farbe] => black-default [pa_groesse] => m) 
     [126] => Array ([pa_farbe] => black-default [pa_groesse] => l) 
     [149] => Array ([pa_farbe] => black-default [pa_groesse] => l) 
     [129] => Array ([pa_farbe] => black-default [pa_groesse] => xl) 
     [130] => Array ([pa_farbe] => black-default [pa_groesse] => xxl) 
     [4287] => Array ([pa_farbe] => white-default [pa_groesse] => s) 
     [4288] => Array ([pa_farbe] => white-default [pa_groesse] => xl) 
     [4289] => Array ([pa_farbe] => white-default [pa_groesse] => xxl) 
     [4290] => Array ([pa_farbe] => white-default [pa_groesse] =>) 
     [4286] => Array ([pa_farbe] => [pa_groesse] =>)) 

注意,doublette是其正確的地方太多:[126]和[149]。

你會怎麼做? 我很欣賞任何建議!

非常感謝您提前!

回答

1

您有2種選擇:使用uasortuksort。如果您使用uasort,則您將面臨的問題是重複。從你的預期輸出看來,如果數組是相同的,他們應該按鍵來排序。在uasort比較功能中,您將無法訪問這些密鑰。

因此,您必須使用uksort並使用密鑰來索引variations_excerpt數組並比較這兩個值。比較功能相對簡單,因爲我們具有不同的尺寸和unique_attribute_values陣列。

下面的代碼:

<?php 
$variations_excerpt = 
array (4288 => array ('pa_farbe' => 'white-default', 'pa_groesse' => 'xl') , 
     128 => array ('pa_farbe' => 'black-default', 'pa_groesse' => 's'), 
     130 => array ('pa_farbe' => 'black-default', 'pa_groesse' => 'xxl'), 
     4289 => array ('pa_farbe' => 'white-default', 'pa_groesse' => 'xxl'), 
     127 => array ('pa_farbe' => 'black-default', 'pa_groesse' => 'm') , 
     129 => array ('pa_farbe' => 'black-default', 'pa_groesse' => 'xl') , 
     4286 => array ('pa_farbe' => '', 'pa_groesse' => ''), 
     149 => array ('pa_farbe' => 'black-default', 'pa_groesse' => 'l'), 
     4287 => array ('pa_farbe' => 'white-default', 'pa_groesse' => 's'), 
     126 => array ('pa_farbe' => 'black-default', 'pa_groesse' => 'l'), 
     4290 => array ('pa_farbe' => 'white-default', 'pa_groesse' => '') 
     ); 

$dummy = $variations_excerpt; 

$unique_attribute_values = 
array ( 
    'pa_farbe' => array ( 
     0 => 'black-default', 
     1 => 'white-default', 
     2 => '' 
    ), 
    'pa_groesse' => array ( 
     5 => 's', 
     6 => 'm', 
     7 => 'l', 
     8 => 'xl', 
     9 => 'xxl', 
     10 => '' 
    ) 
    ); 
$dim_names = array('pa_farbe', 'pa_groesse'); 
uksort($variations_excerpt, "cmp"); 

function cmp($a, $b) { 
    global $dim_names, $unique_attribute_values, $dummy; 
    foreach($dim_names as $d) { 
     $x = array_search($dummy[$a][$d], $unique_attribute_values[$d]); 
     $y = array_search($dummy[$b][$d], $unique_attribute_values[$d]); 
     if ($x < $y) { 
      return -1; 
     } else if ($x > $y) { 
      return 1; 
     } 
    } 
    if ($a < $b) 
     return -1; 
    else 
     return 1; 
} 

print_r($variations_excerpt); 

?> 

希望它能幫助。

注:由OP指出,可能出現的問題:

(1)需要定義的「議定書」功能,這就是所謂的uksort前()。或者,可以使用uksort()的匿名函數。 (2)首先需要初始化'cmp'函數範圍中使用的全局變量,該函數也在此範圍之外。

+0

夥計,我想是這樣!真棒! – Darkwing

+0

我只需要對你的答案做一些小的改動,也許你可以在下面編輯它們: (1)需要定義'cmp'函數_before_它在uksort()中被調用。或者,可以使用uksort()的匿名函數 - 就像我現在所做的那樣。 (2)首先需要初始化'cmp'函數範圍中使用的全局變量,該範圍也是'全局'的_outside_。 然後它工作正常! (也許行爲取決於PHP版本?) (哦,並且:抱歉回答那種遲了,但是我的顯卡在發佈這個問題後決定在第二天早上死掉......) – Darkwing

+0

看起來確實像你提到的問題是取決於具體的版本或者特定的設置。它在這裏運行良好:http://ideone.com/dx9DlO –

相關問題