2011-07-20 3 views
0

最近のアクティビティセクションを作成していますが、同様のアイテムをグループ化しようとしています。私は、活動のタイプと活動を行った人に基づいて活動をグループ化できるようにしたい。2つ以上の異なる値にPHP配列をグループ化する

Array 
(
    [0] => Array 
     (
      [user] => Bill 
      [type] => photo 
      [id] => 1 
      [timestamp] => 12345678 
     ) 

    [1] => Array 
     (
      [user] => Joe 
      [type] => photo 
      [id] => 2 
      [timestamp] => 12345678 
     ) 

    [2] => Array 
     (
      [user] => Bill 
      [type] => comment 
      [id] => 1 
      [timestamp] => 12345678 
     ) 

    [3] => Array 
     (
      [user] => Bill 
      [type] => photo 
      [id] => 3 
      [timestamp] => 12345678 
     ) 

) 

は、このになるかもしれない:例えば

Array 
(
    [0] => Array 
     (
      [user] => Bill 
      [type] => photo 
      [items] => Array 
       (
        [0] => Array 
         (
          [id] => 1 
          [timestamp] => 12345678 
         ) 

        [1] => Array 
         (
          [id] => 3 
          [timestamp] => 12345678 
         ) 

       ) 

     ) 

    [1] => Array 
     (
      [user] => Joe 
      [type] => photo 
      [items] => Array 
       (
        [0] => Array 
         (
          [id] => 2 
          [timestamp] => 12345678 
         ) 

       ) 

     ) 

    [2] => Array 
     (
      [user] => Bill 
      [type] => comment 
      [items] => Array 
       (
        [0] => Array 
         (
          [id] => 1 
          [timestamp] => 12345678 
         ) 

       ) 

     ) 

) 

これは私がやろうとしてではなく、かなりそこにい何ほとんどです:Grouping arrays in PHP

誰もがアイデアを持っていますか?

答えて

1

あなたのグループが正確に(それはあなたの編集後、もう少し理にかなって)意味がない、これを試してみてください。

foreach ($activity as $data) { 
    $newdata[$data['user']][$data['type']]['id'][]=$data['id']; 
    $newdata[$data['user']][$data['type']]['timestamp'][]=$data['timestamp']; 
} 

編集し、ご希望の出力の変化を反映するために:(および構造をそのでもっと便利ビット)

foreach ($activity as $data) { 
    $newdata[$data['user']][$data['type']]['items'][]=array('id'=>$data['id'],'timestamp'=>$data['timestamp']); 
} 

編集2:

あなたが持っている必要があります何らかの種類のキー、この場合はユーザー名とタイプのコンボです。その後、それを再索引付けしなければならないので、その数値が実際に重要です。それは正確に何をしたいと非常に近いはずである。

foreach ($activity as $data) { 
     $key=$data['user'].'-'.$data['type']; 
     $newdata[$key]['items'][]=array('id'=>$data['id'],'timestamp'=>$data['timestamp']); 
     $newdata[$key]['user']=$data['user']; 
     $newdata[$key]['type']=$data['type']; 
} 
$newdata=array_values($newdata); 
テスト


http://www.ideone.com/3uZdd

編集3:

別の日付...これはあなたを取得する考えであります開始するには、これを元の配列にもう少しやり直す必要があります。

foreach ($activity as $data) { 
     $key=$data['user'].'-'.$data['type']; 
     $newdata[$key]['items'][$data['day']][]=array('id'=>$data['id'],'timestamp'=>$data['timestamp']); 
     $newdata[$key]['user']=$data['user']; 
     $newdata[$key]['type']=$data['type']; 
} 
$newdata=array_values($newdata); 
+0

これはかなりお世話になりました。私の場合、基本的には私の例のように、ユーザーの子にならないように(グループ化した後に)それぞれの出力アクションを持たせる方が良いでしょう。 – noel

+0

のように出力されます: *ビルは2枚の写真を追加しました *ジョーは写真番号1を付けました *ビルはコメント番号1を付けました。 – noel

+0

@ndogがもう一度更新されました。あなたのデータ構造はまだ理にかなっていませんが、それはあなたが望むことをするはずです。 – profitphp

0

を使用して、usertypeの値で並べ替えるカスタム関数を使用してみてください。

関連する問題