2012-09-25 24 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