PHP Sort array into subarrays by two fields

chrisShick

I have the following array:

array(
 [0] =>array(
   'Users'=>array(
        'id'=>2,
        'start_date'=>2014-02-05,
        'end_date'=>2014-02-09
    )
  ),
  [1]=> array(
    'Users'=>array(
        'id'=>3,
        'start_date'=>2014-02-05,
        'end_date'=>2014-02-09
    )
  ),
  [2]=> array(
    'Users'=>array(
        'id'=>4,
        'start_date'=>2014-02-09,
        'end_date'=>2014-02-12
    )
  ),
  [3]=> array(
    'Users'=>array(
        'id'=>5,
        'start_date'=>2014-02-15,
        'end_date'=>2014-02-25
    )
  )
 )

What I need to do is sort this array into subarrays where both start_date and end_date match like this:

array(
   [0] => array(
      'Users'=>array(
          [0] => array(
            'id'=>2,
            'start_date'=>2014-02-05,
            'end_date'=>2014-02-09
          ),
          [1] => array(
            'id'=>3,
            'start_date'=>2014-02-05,
            'end_date'=>2014-02-09
          )
       )
   ),
   [1] => array(
      'Users'=>array(
          [0] => array(
            'id'=>4,
            'start_date'=>2014-02-09,
            'end_date'=>2014-02-12
          )
       )
   ),
   [2] => array(
      'Users'=>array(
          [0] => array(
            'id'=>5,
            'start_date'=>2014-02-15,
            'end_date'=>2014-02-25
          )
       )
   )
)

I know how I can do it based on one field, but I haven't quite managed two.

EDIT: What I am basically trying to do is not so much a sort but more of group like elements of an array into subarrays.

user1978142

Alternatively, you could just create a new one. Of course you need to loop them and group them according to start_date or end_date (I don't know if Cake has an elegant solution for this task, I haven't used it.). Consider this example:

$values = array(array('Users' => array(array('id' => 2, 'start_date' => '2014-02-05', 'end_date' => '2014-02-09'),)),array('Users' => array(array('id' => 3, 'start_date' => '2014-02-05', 'end_date' => '2014-02-09'),)),array('Users' => array(array('id' => 4, 'start_date' => '2014-02-09', 'end_date' => '2014-02-12'),)),array('Users' => array(array('id' => 5, 'start_date' => '2014-02-15', 'end_date' => '2014-02-25'),)),);
$new_values = array();
foreach($values as $key => $value) {
    $value = reset($value); // users
    foreach($value as $element) {
        // group them according to start and date date
        // make them an index
        $index = $element['start_date'] . ' to ' . $element['end_date'];
        $new_values[$index]['Users'][] = $element;
    }
}

$new_values = array_values($new_values); // simple reindexing, reset to numeric
echo '<pre>';
print_r($new_values);

Should yield this group:

Array
(
    [0] => Array
    (
        [Users] => Array
        (
            [0] => Array
            (
                [id] => 2
                [start_date] => 2014-02-05
                [end_date] => 2014-02-09
            )

            [1] => Array
            (
                [id] => 3
                [start_date] => 2014-02-05
                [end_date] => 2014-02-09
            )
        )
    )

    [1] => Array
    (
        [Users] => Array
        (
            [0] => Array
            (
                [id] => 4
                [start_date] => 2014-02-09
                [end_date] => 2014-02-12
            )
        )
    )

    [2] => Array
    (
        [Users] => Array
        (
            [0] => Array
            (
                [id] => 5
                [start_date] => 2014-02-15
                [end_date] => 2014-02-25
            )
        )
    )
) 

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related