2013-03-29 24 views
0

嘿傢伙我試圖反向排序一個多維數組與usort,但我搞亂了某處。這裏是我的代碼:PHP反向排序的子數組按鍵

$array = array(
    array(123 => 'foo'), // duplicate 
    array(124 => 'foo'), 
    array(127 => 'foo'), 
    array(126 => 'foo'), 
    array(123 => 'foo'), // duplicate 
    array(125 => 'foo'), 
); 

function rcmp($a, $b) { 
    if($a == $b) { 
     return 0; 
    } 
    return ($a < $b) ? -1 : 1; 
} 

usort($array, 'rcmp'); 

print_r($array); 

/* 
    Array 
    (
     [0] => Array ([126] => foo)) 
     [1] => Array ([125] => foo)) 
     [2] => Array ([127] => foo)) 
     [3] => Array ([123] => foo)) 
     [4] => Array ([124] => foo)) 
     [5] => Array ([123] => foo)) 
    ) 
*/ 

我期待

/* 
    Array 
    (
     [0] => Array ([127] => foo)) 
     [1] => Array ([126] => foo)) 
     [2] => Array ([125] => foo)) 
     [3] => Array ([124] => foo)) 
     [4] => Array ([123] => foo)) 
     [5] => Array ([123] => foo)) 
    ) 
*/ 

我在做什麼錯?

+0

我可能會錯過一些東西,但似乎您正在嘗試對所有具有相同價值的東西進行排序。 – Gabor

+0

關鍵是所有不同 – ehime

+0

所以基本上你想要在你的子陣列上做一個'krsort'?編輯:我誤解你的代碼...我現在明白了:) – Gabor

回答

1

如果你想在數組的索引比較,你必須提取指標的比較功能和反向遞減順序

function rcmp($a, $b) { 
    $a = array_keys($a); 
    $b = array_keys($b); 

    if($a[0] == $b[0]) { 
     return 0; 
    } 

    return ($a[0] < $b[0]) ? 1 : -1; 
} 
2

當您的比較函數rcmp被調用時,其參數$a$b是數組,因此您的等於和小於運算符具有數組作爲它們的操作數。

在陣列上的相等運算工作like this

TRUE if $a and $b have the same key/value pairs. 

的小於比較工作like this

陣列用更少的部件更小,如果從操作數1密鑰不被在操作數中發現2則 數組無法比較,否則 - 按值比較值。

「不可比」是指比較結果爲null,這反過來導致rcmp返回1

那麼最終發生的是,當$a$b是不相同的陣列rcmpalways returns 1(即認爲$a是更大)。無論每個數組中的關鍵字是什麼,都會發生這種情況,結果導致無意義的排序。

如果你想訂購這些陣列由他們的第一個鍵與usort,你會做這樣的:

function rcmp($a, $b) 
{ 
    return key($a) - key($b); 
} 
+0

你說得對,我需要使用'key()'來比較。您的功能不起作用雖然=( – ehime

0

下面是使用我想出了,接受最好的答案雖然create_function的解決方案進行比較。謝謝,並希望這可以幫助別人。 (array)(126 =>'foo'),//重複 array(127 =>'foo'), array(126 =>'foo'), array array(124 =>'foo'), array '), array(123 =>'foo'),//重複 array(125 =>'foo'), );

usort($array, create_function('$a, $b','return (key($a) == key($b)) 
               ? 0 
               : (key($a) < key($b)) 
                ? -1 
                : 1;')); 

print_r($array);