2014-11-25 60 views
0

我的问题是,我想基于起始时间我的阵列看起来像这样打破一个阵列中的两个不同的阵列在PHP

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 
     ) 

) 

像这样

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 
    ) 
) 
在打破阵列两个不同的阵列

并且数据是从数据库动态传入的。请帮助我

+0

你到目前为止莫希特做了什么? – diEcho 2014-11-25 05:42:58

+0

@diEcho我那么努力做的,但在端部余did't得到的结果,我试图和得到这样的结果阵列 ( [天] =>数组 ( [0] =>周一 [1] = >星期二 [2] =>星期三 [3] =>星期五 [4] =>星期六 [5] =>周日 ) [START_TIME] =>数组 ( [0] => 11: 00 AM => 11:00 AM [2] => 11:00 AM [3] => 12:00 PM [4] => 12:00 PM [ 5] => 12:00 PM ) ) – 2014-11-25 05:46:48

+4

嗨mohit,你不能有一个像你需要在输出中一样的数组。因为day_of_weeks – 2014-11-25 05:50:01

回答

1

这不是一个完整的解决方案,但可能给你如何进行的一些想法:

$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 
     ) 
) 
) 

也许你应该能够改变你的MySQL查询,以获得所需的输出。例如运行下表对这个查询:

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 | 
+--------------+------------+----------+ 

上面的例子将返回属于由,字符分隔同一start_time所有天。请注意,end_time的值并未真正使用,对于前一个使用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 | 
+--------------------------+------------+----------+ 

然后,您可以使用explode()或相似得到的每一天:

foreach($results as $record) { 
    $days = explode(",", $record['day_of_weeks']; 
} 
+1

@MohitJain - 很高兴帮助=) – Cyclonecode 2014-11-25 06:31:52

+1

@MohitJain - 不知道它是否会有所帮助,但我添加了一个可以完成这项工作的MySQL解决方案。 – Cyclonecode 2014-11-25 06:43:16

+0

再次感谢sql查询,但你的代码是为我工作..无需修改我的sql查询 – 2014-11-25 06:52:39

1

首先,因为你已经写在你需要的输出,你不能有多个不同的值day_of_weeks,但是可以使day_of_weeks一个包含日期名称的数组。

此外,由于它看起来像是在您的输出中使用了start_timeend_time作为唯一键,所以我建议在数组键中使用它们来简化程序。

所以这给了我们:

$output_array = array(); 
foreach ($input_array as $data_item) { 
    $time_key = $data_item['start_time'] . ' - ' . $data_item['end_time']; 
    if (isset($output_array[$time_key]['day_of_weeks'])) { 
     $output_array[$time_key]['day_of_weeks'][] = $data_item['day_of_weeks']; 
    } else { 
     $output_array[$time_key] = array(
      'day_of_weeks' => array($data_item['day_of_weeks']), 
      'start_time' => $data_item['start_time'], 
      'end_time'  => $data_item['end_time'], 
     ); 
    } 
} 

这将导致:

Array(
    ['6:00 PM - 7:00 PM'] => Array 
    (
     [day_of_weeks] => Array(
      [0] => Monday, 
      [1] => Tuesday, 
      [2] => Wednesday, 
     ), 
     [start_time] => 6:00 PM 
     [end_time] => 7:00 PM 
    ) 
    ['5:00 PM - 6:00 PM'] => Array 
    (
     [day_of_weeks] => Array(
      [0] => Friday, 
      [1] => Saturday, 
      [2] => Sunday, 
     ), 
     [start_time] => 5:00 PM 
     [end_time] => 6:00 PM 
    ) 
) 
+0

你解决方案给我最后的价值的数组,如周三和周日day_of_weeks – 2014-11-25 06:06:33

+0

修改你的代码后,我几乎得到了结果,但上面的答案给我整个解决方案 – 2014-11-25 06:29:47