Search code examples
phparrayscodeignitercodeigniter-2

Break one array in to two different array in php


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


Solution

  • 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'];
    }