Laravel系列定制

Given array like this, I want to arrange data in a custom way.

array:5 [
      0 => array:4 [
        "message" => "Message number 1 for first conversation"
        "is_seen" => 0
        "user_id" => 2
        "sent_time" => "2017-08-30 23:28:50"
      ]
      1 => array:4 [
        "message" => "Message number 2 for first conversation"
        "is_seen" => 1
        "user_id" => 1
        "sent_time" => "2017-08-29 23:36:27"
      ]
      2 => array:4 [
        "message" => "Message number 3 for first conversation"
        "is_seen" => 1
        "user_id" => 1
        "sent_time" => "2017-08-29 23:36:27"
      ]
      3 => array:4 [
        "message" => "Message number 4 for first conversation by second user"
        "is_seen" => 1
        "user_id" => 2
        "sent_time" => "2017-08-29 23:36:27"
      ]
      4 => array:4 [
        "message" => "Message number 5 for first conversation by second user"
        "is_seen" => 1
        "user_id" => 2
        "sent_time" => "2017-08-29 23:36:27"
      ]
    ]

What I want to do is to group messages that are sent by the same user so I get an array like this :

$data = [
    "block" => [
        [
            "message" => "Message number 1 for first conversation",
            "is_seen" => 0,
            "user_id" => 2,
            "sent_time" => "2017-08-30 23:28:50"
        ]
    ],
    "block" => [
        [
            "message" => "Message number 2 for first conversation",
            "is_seen" => 1,
            "user_id" => 1,
            "sent_time" => "2017-08-29 23:36:27"
        ],
        [
            "message" => "Message number 3 for first conversation",
            "is_seen" => 1,
            "user_id" => 1,
            "sent_time" => "2017-08-29 23:36:27"
        ]
    ],
   "block" => [
        [
            "message" => "Message number 4 for first conversation by second user",
            "is_seen" => 1,
            "user_id" => 2,
            "sent_time" => "2017-08-29 23:36:27"
        ],
        [
            "message" => "Message number 5 for first conversation by second user",
            "is_seen" => 1,
            "user_id" => 2,
            "sent_time" => "2017-08-29 23:36:27"
        ]
    ]
];

So basically, If next message user_id is same as previous message user_id add it to group array. If it is not, create new group array and so on. I do not want to group all user messages together since this structure is required for pagination in front-end.

You can do it like this

 $new = array();
 $prev = "";
 $count =0;
 foreach($arr as $key=> $value){
    if($prev == $value["user_id"]){
      $new[$count-1][] = $value;
    }else {
      $new[$count][] = $value;
      $count++;
    }$prev = $value["user_id"];
}
print_r($new);

Live demo : https://eval.in/854288

First of all you cannot have duplicate associative keys into the same array however, you group the blocks by some sequential number in the following way:

$group_num = 0;

$col = collect($data);

$col->groupBy(function ($item, $key) use (&$group_num, $col)
{

    if (!isset($col[$key - 1]))       
        return "block_" . $group_num;

    if ($item['user_id'] !== $col[$key - 1]['user_id'])
        $group_num++;

    return "block_" . $group_num;

})
->toArray();

The result it should be something like:

[
     "block_0" => [
       [
         "message" => "Message number 1 for first conversation",
         "is_seen" => 0,
         "user_id" => 2,
         "sent_time" => "2017-08-30 23:28:50",
       ],
     ],
     "block_1" => [
       [
         "message" => "Message number 2 for first conversation",
         "is_seen" => 1,
         "user_id" => 1,
         "sent_time" => "2017-08-29 23:36:27",
       ],
       [
         "message" => "Message number 3 for first conversation",
         "is_seen" => 1,
         "user_id" => 1,
         "sent_time" => "2017-08-29 23:36:27",
       ],
     ],
     "block_2" => [
       [
         "message" => "Message number 4 for first conversation by second user",
         "is_seen" => 1,
         "user_id" => 2,
         "sent_time" => "2017-08-29 23:36:27",
       ],
       [
         "message" => "Message number 5 for first conversation by second user",
         "is_seen" => 1,
         "user_id" => 2,
         "sent_time" => "2017-08-29 23:36:27",
       ],
     ],
   ]