2013-01-31 33 views
-1

请你能好心帮助,我有以下$事件阵列和我想的排序值到我的事件数组中的“”数组进行排序。不正确使用usort的

Array ([0] => Array ( 
      [date] => 20130329 
      [title] => Run 
      [cats] => Array ( 
      [0] => Array ( 
      [name] => Cause 2 
      [slug] => cause-2 
      [sort] => 1)) 
     ) 

     [1] => Array ( 
      [date] => 20130131 
      [title] => Run2 
      [cats] => Array ( 
      [0] => Array ( 
      [name] => Abused Children 
      [slug] => abused-children 
      [sort] => 2) 
      [1] => Array ( 
      [name] => Animal Welfare 
      [slug] => animal-welfare 
      [sort] => 3) 
      [2] => Array ( 
      [name] => Education 
      [slug] => education 
      [sort] => 1) 
      ) ) 

当我对[cat]进行foreach时,我希望它按排序顺序迭代,例如。

Event: Run2 
Cat: Education 
Cat: Abused Children 
Cat: Animal Welfare 

在我的代码,我有这样的事情

usort($events, function($a, $b) { 
return $a['cats']['sort'] - $b['cats']['sort']; }); 

foreach($events as $event) { 
    foreach($event['cats'] as $cat) { 
     echo $cat['name'] 
    } 
} 
+1

什么是你的排序的逻辑是什么?您的预期结果似乎没有按字典顺序排列。 – Passerby

+1

这是排序在['sort']这是一个数字 – Dale

回答

2

好像你想每一个事件里面的猫数组进行排序。在这种情况下,请在嵌套循环中移动排序函数:

foreach($events as $event) { 
    usort($event['cats'], function ($a, $b) { 
     return $a['sort'] - $b['sort']; 
    }); 
    foreach($event['cats'] as $cat) { 
     echo $cat['name'] 
    } 
} 
+0

你是这样的天才!非常感谢。不知道为什么我因为我的问题而被低估了,但你已经几个小时节省了我的时间,所以我很感激。 – uknowit2

1

好的,我发表评论时有点厌倦。因此,这里有一个解决方案,在输出之前将源数组调整为所需的顺序。

$events=array(array("date"=>"20130329","title"=>"Run","cats"=>array(array("name"=>"Cause 2","slug"=>"cause-2","sort"=>1))),array("date"=>"20130131","title"=>"Run2","cats"=>array(array("name"=>"Abused Children","slug"=>"abused-children","sort"=>2),array("name"=>"Animal Welfare","slug"=>"animal-welfare","sort"=>3),array("name"=>"Education","slug"=>"education","sort"=>1)))); 
$events=array_map(function($arr){ 
    usort($arr["cats"],function($a,$b){ 
     return $a["sort"]-$b["sort"]; 
    }); 
    return $arr; 
},$events); 
foreach($events as $event) 
{ 
    echo "Event: ".$event["title"]."\n"; 
    foreach($event["cats"] as $cat) 
    { 
     echo " Cat: ".$cat["name"]."\n"; 
    } 
} 

以上输出:

Event: Run 
    Cat: Cause 2 
Event: Run2 
    Cat: Education 
    Cat: Abused Children 
    Cat: Animal Welfare 

Live example

+0

非常感谢,也应该这样做。 – uknowit2