2012-09-25 47 views
1

在PHP的,我有這種類型的數組(抱歉大的例子,但它是一個特定的排序):PHP:分選multidimensionnal陣列具有非恆定的數字鍵

[0] => Array 
    (
     [title] => 1 
     [desc] => 2 
    ) 
[1] => Array 
    (
     [title] => 1 
     [desc] => 3 
    ) 
[2] => Array 
    (
     [title] => 1 
     [desc] => 2 
     [content] => 10 
    ) 
[3] => Array 
    (
     [title] => 1 
     [desc] => 2 
     [content] => 11 
    ) 
[4] => Array 
    (
     [title] => 1 
     [desc] => 3 
     [content] => 9 
    ) 
[5] => Array 
    (
     [title] => 1 
     [desc] => 2 
     [content] => 10 
     [tag] => 'foo' 
    ) 
[6] => Array 
    (
     [title] => 1 
     [desc] => 2 
     [content] => 10 
     [tag] => 'bar' 
    ) 

而且我想這樣的輸出:

[0] => Array 
    (
     [title] => 1 
     [desc] => 2 
    ) 
[1] => Array 
    (
     [title] => 1 
     [desc] => 2 
     [content] => 10 
    ) 
[2] => Array 
    (
     [title] => 1 
     [desc] => 2 
     [content] => 10 
     [tag] => 'bar' 
    ) 
[3] => Array 
    (
     [title] => 1 
     [desc] => 2 
     [content] => 10 
     [tag] => 'foo' 
    ) 
[4] => Array 
    (
     [title] => 1 
     [desc] => 2 
     [content] => 11 
    ) 
[5] => Array 
    (
     [title] => 1 
     [desc] => 3 
    ) 
[6] => Array 
    (
     [title] => 1 
     [desc] => 3 
     [content] => 9 
    ) 

而且偏偏array_multisort()無法排序與非恆定的數字鍵的排列:它只是忽略了所有的數組... 任何想法?

+2

檢查usort ..... ... – xdazz

回答

0

這裏是排序的示例代碼:

function cmp ($a, $b) { 
    if ($a['desc'] == $b['desc']) { 
    if (!isset($a['content']) && !isset($b['content'])) { 
     return 0; 
    } 
    else if (!isset($a['content'])) { 
     return -1; 
    } 
    else if (!isset($b['content'])) { 
     return 1; 
    } 
    else { 
     if ($a['content'] == $b['content']) { 
     if (!isset($a['tag'])) { 
      return -1; 
     } 
     else if (!isset($b['tag'])) { 
      return 1; 
     } 
     else { 
      if ($a['tag'] == $b['tag']) { 
      return 0; 
      } 
      else if ($a['tag'] < $b['tag']) { 
      return -1; 
      } 
      else { 
      return 1; 
      } 
     } 
     return 0; 
     } 
     else if ($a['content'] < $b['content']) { 
     return -1; 
     } 
     else { 
     return 1; 
     } 
    } 
    return 0; 
    } 
    else if ($a['desc'] < $b['desc']) { 
    return -1; 
    } 
    else { 
    return 1; 
    } 
} 
usort($array, 'cmp'); 

感謝@Nelson,@therefromhere和@xdazz把我的usort() :)

2

我不清楚你要訂購什麼標準,但你可以使用usort,你提供了一個定義比較的函數。

+0

實際上,按照數字順序排序是每個鍵上的循環。我想我可以用很多循環重建數組? –

2

可以使用usort具有量身定製功能cmp爲您的特殊需求,如下面的代碼:

usort($arr, "cmp"); 

function cmp($a, $b) { 
    $array = array('title','desc','content','tag'); 
    foreach ($array as &$ar) { 
     $ai = isset($a[$ar]); 
     $bi = isset($b[$ar]); 
     if ($ai && !$bi) { 
      return 1; 
     } 
     if ($bi && !$ai) { 
      return -1; 
     } 
     if (!$bi) { 
      return 0; 
     } 
     if ($a[$ar] > $b[$ar]) { 
      return 1; 
     } 
     if ($b[$ar] > $a[$ar]) { 
      return -1; 
     } 
    } 
    return 0; 
} 

應該做你想做的。

+0

這就是我剛纔在我身邊做的!完美:) –

+0

我很高興你有它的工作,我的代碼似乎更簡潔和可讀,你的版本,所以你可能會認爲它作爲一種替代方法來比較。請記住提出任何你認爲有用的答案,並接受你想要的任何答案(也可能是你的答案)。 – Nelson