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",
],
],
]