2013-03-12 281 views
0

我有一个数组,看起来像这样:PHP排序多维数组

Array 
(
[13] => Array 
     (
      [name] => Blah blah 
      [description] => Blah blah blah 
      [parent_group_id] => 8 
      [display] => Blah : Blah 
      [stamps] => Array 
       (
        [73] => Array 
         (
          [stamp_id] => 73 
          [name] => Blah 
          [is_member] => 
          [rank] => 2   <-- 
          [description] => Blah blah blah 
          [rank_token] => easy 
         ) 
        [80] => Array 
         (
          [stamp_id] => 80 
          [name] => Blah 
          [is_member] => 
          [rank] => 1   <-- 
          [description] => Blah blah blah 
          [rank_token] => medium 
         ) 
        [73] => Array 
         (
          [stamp_id] => 73 
          [name] => Blah 
          [is_member] => 
          [rank] => 4   <-- 
          [description] => Blah blah blah 
          [rank_token] => easy 
         ) 

        [80] => Array 
         (
          [stamp_id] => 80 
          [name] => Blah 
          [is_member] => 
          [rank] => 3   <-- 
          [description] => Blah blah blah 
          [rank_token] => medium 
         ) 
       ) 
     ) 
) 

然而,我要通过[“秩”]保持它们是1,2中的数字时,这个阵列中的对象进行排序,3和4.(我在代码示例中添加了箭头)因此,在使用usort之后,我希望所有内容都按数字顺序排序。所以我希望它看起来像这样:

Array 
(
[13] => Array 
     (
      [name] => Blah blah 
      [description] => Blah blah blah 
      [parent_group_id] => 8 
      [display] => Blah : Blah 
      [stamps] => Array 
       (
        [80] => Array 
         (
          [stamp_id] => 80 
          [name] => Blah 
          [is_member] => 
          [rank] => 1   <-- 
          [description] => Blah blah blah 
          [rank_token] => medium 
         ) 
        [73] => Array 
         (
          [stamp_id] => 73 
          [name] => Blah 
          [is_member] => 
          [rank] => 2   <-- 
          [description] => Blah blah blah 
          [rank_token] => easy 
         ) 
        [80] => Array 
         (
          [stamp_id] => 80 
          [name] => Blah 
          [is_member] => 
          [rank] => 3   <-- 
          [description] => Blah blah blah 
          [rank_token] => medium 
         ) 
        [73] => Array 
         (
          [stamp_id] => 73 
          [name] => Blah 
          [is_member] => 
          [rank] => 4   <-- 
          [description] => Blah blah blah 
          [rank_token] => easy 
         ) 
       ) 
     ) 
) 

我的实际数组要大得多,但它仍然遵循这种模式。

+0

我认为这将有助于: michi 2013-03-12 21:59:46

+1

你刚才提到'usort',你试过了什么? 'foreach($ array as $ key => $ value)usort($ array [$ key] ['stamps'],'yourusortfunction');' – Wrikken 2013-03-12 22:00:13

回答

1

这应该工作,如果我理解正确你的问题:

function cmp($a, $b) 
{ 
    if ($a['rank'] == $b['rank']) { 
     return 0; 
    } 
    return ($a['rank'] < $b['rank']) ? -1 : 1; 
} 
foreach($yourArray as &$entry) { 
    uasort($entry['stamps'], "cmp"); 
} 
unset($entry); 

print_r($yourArray); 

注意,CMP功能几乎是一样的说明书中无。 foreach中的&符号意味着创建的变量是数组成员的别名,而不是副本(正如PHP通常所做的那样)。 unset()在那里,因为如果你以后尝试使用一个名为$ entry的变量,你实际上会操作数组中的最后一个条目。

如果您对此感到不舒服,还有其他方法可以对其进行剥皮;例如,您可以创建第二个功能,它array_map你原来的,即:

function cmp($a, $b) 
{ 
    if ($a['rank'] == $b['rank']) { 
     return 0; 
    } 
    return ($a['rank'] < $b['rank']) ? -1 : 1; 
} 
function sort_entry($entry) 
{ 
    uasort($entry['stamps'], "cmp"); 
    return $entry; 
} 
array_map('sort_entry', $yourArray);  
print_r($yourArray); 
+0

像魅力一样工作,非常感谢! – user2154729 2013-03-12 22:22:54

+0

没有问题,祝你有个愉快的夜晚 – Matt 2013-03-12 22:26:23