my question is i want to break array in to two different array based upon start time my array look like this
Array
(
[0] => Array
(
[day_of_weeks] => Monday
[start_time] => 6:00 PM
[end_time] => 7:00 PM
)
[1] => Array
(
[day_of_weeks] => Tuesday
[start_time] => 6:00 PM
[end_time] => 7:00 PM
)
[2] => Array
(
[day_of_weeks] => Wednesday
[start_time] => 6:00 PM
[end_time] => 7:00 PM
)
[3] => Array
(
[day_of_weeks] => Friday
[start_time] => 5:00 PM
[end_time] => 6:00 PM
)
[4] => Array
(
[day_of_weeks] => Saturday
[start_time] => 5:00 PM
[end_time] => 6:00 PM
)
[5] => Array
(
[day_of_weeks] => Sunday
[start_time] => 5:00 PM
[end_time] => 6:00 PM
)
)
something like this
Array(
[0] => Array
(
[day_of_weeks] => Monday
[day_of_weeks] => Tuesday
[day_of_weeks] => Wednesday
[start_time] => 6:00 PM
[end_time] => 7:00 PM
)
[1] => Array
(
[day_of_weeks] => Friday
[day_of_weeks] => Saturday
[day_of_weeks] => Sunday
[start_time] => 5:00 PM
[end_time] => 6:00 PM
)
)
and data is dynamically coming form database. Pls help me
This is not a complete solution but might give you some idea on how to proceed:
$array = array(
array(
'day_of_weeks' => 'Monday',
'start_time' => '6:00 PM',
'end_time' => '7:00 PM'
),
array(
'day_of_weeks' => 'Tuesday',
'start_time' => '6:00 PM',
'end_time' => '7:00 PM'
),
array(
'day_of_weeks' => 'Friday',
'start_time' => '5:00 PM',
'end_time' => '6:00 PM'
)
);
$result = array();
// walk over each element of the original array
array_walk($array, function(&$item, $key) use (&$result) {
// if the key denoted by `start_time` exists append the `day_of_weeks`
if(array_key_exists($item['start_time'], $result)) {
$result[$item['start_time']]['day_of_weeks'][] = $item['day_of_weeks'];
} else {
// make `day_of_weeks` an array that can hold more values
$result[$item['start_time']] = array(
'start_time' => $item['start_time'],
'end_time' => $item['end_time'],
'day_of_weeks' => array($item['day_of_weeks'])
);
}
});
// the output of $result would be
Array
(
[6:00 PM] => Array
(
[start_time] => 6:00 PM
[end_time] => 7:00 PM
[day_of_weeks] => Array
(
[0] => Monday
[1] => Tuesday
)
)
[5:00 PM] => Array
(
[start_time] => 5:00 PM
[end_time] => 6:00 PM
[day_of_weeks] => Array
(
[0] => Friday
)
)
)
Perhaps you should be able to change your mysql query to get the desired output. For example running this query against the following table:
SELECT GROUP_CONCAT(day_of_weeks) day_of_weeks,
start_time,
end_time
FROM data
GROUP BY start_time
ORDER BY start_time DESC;
+--------------+------------+----------+
| day_of_weeks | start_time | end_time |
+--------------+------------+----------+
| Monday | 6:00 PM | 7:00 PM |
| Tuesday | 6:00 PM | 7:00 PM |
| Wednesday | 6:00 PM | 7:00 PM |
| Friday | 5:00 PM | 6:00 PM |
| Saturday | 5:00 PM | 6:00 PM |
| Sunday | 5:00 PM | 6:00 PM |
+--------------+------------+----------+
The above example would return all days belonging to the same start_time
separated by a ,
character. Note that the value of end_time
is not really used, this is also true for the previous example using array_walk()
.
+--------------------------+------------+----------+
| day_of_weeks | start_time | end_time |
+--------------------------+------------+----------+
| Monday,Tuesday,Wednesday | 6:00 PM | 7:00 PM |
| Friday,Saturday,Sunday | 5:00 PM | 6:00 PM |
+--------------------------+------------+----------+
You could then get each day using explode()
or similar:
foreach($results as $record) {
$days = explode(",", $record['day_of_weeks'];
}