2011-09-06 110 views
2

我需要一种方法来合并阵列合并成多维数组

Array(
    [0] => Array 
    (
     [event_id] => 1 
     [time] => '21:00pm' 
     [day] => 'Monday' 
    ) 
    [1] => Array 
    (
     [event_id] => 2 
     [time] => '18:00pm' 
     [day] => 'Monday' 
    ) 
    [2] => Array 
    (
     [event_id] => 3 
     [time] => '21:00pm' 
     [day] => 'Tuesday' 
    ) 
) 

到:

Array (
    [0] => Array 
     (
      [event_id] => Array 
       (
       [0] => 1 
       [1] => 2 
       ) 
      [time] => Array 
       (
       [0] => '21:00pm' 
       [1] => '18:00pm' 
       ) 
      [day] => 'Monday' 
    ) 
    [1] => Array 
    (
      [event_id] => 3 
      [time] => '21:00pm' 
      [day] => 'Tuesday' 
    ) 
) 

因此,新的阵列是由天键进行了分组,如果值是合并之间的不同数组,那么合并的值就成为一个数组。

+0

我已经尝试过没有工作,所以没有点把它放在这里,但http://stackoverflow.com/questions/4843263/merge-arrays-php这篇文章,如果有点我需要,而不是连接我想让它们成为一个新数组的值。 – user813720

回答

2

这应该有效。

$output = getMergedArray($input); // $input is your sample array 

function getMergedArray($input_array) { 
    $output_array = array(); 
    foreach ($input_array as $key => $value) { 
    $event_id = $value['event_id']; 
    $time = $value['time']; 
    $day = $value['day']; 
    $day_id = getDay($output_array, $day); 
    if (count($output_array) > 0 && $day_id >= 0) { 
     if (!is_array($output_array[$day_id]['event_id'])) { 
     $output_array[$day_id]['event_id'] = array($output_array[$day_id]['event_id']); 
     $output_array[$day_id]['time'] = array($output_array[$day_id]['time']); 
     } 
     array_push($output_array[$day_id]['event_id'],$event_id); 
     array_push($output_array[$day_id]['time'],$time); 
    } else { 
     $output_array[] = $value; 
    } 
    } 
    return $output_array; 
} 

function getDay($output_array, $day) { 
    if (count($output_array) > 0) 
    foreach($output_array as $key => $value) 
     if ($value['day'] == $day) 
     return $key; 

    return -1; 
} 
+0

谢谢,这对我很有用,因为真正的数组有更多的键,我为了简单起见而省略了。 – user813720

2

我想不出一个内置的函数会为你做这个。我认为你将不得不循环,将事件按天分组,然后循环遍历组并转换为正确的输出格式。

E.g.

这并没有考虑到这样的事实,即日子可能不总是在同一个案中,也不会按时间顺序排列事件,这也可能是必需的。

function convert_event_array ($array) { 

    // Declare the arrays we will use 
    $temp = array(
    // Declare the day keys, so they appear in the right order in the output 
    'Monday'=>array(), 
    'Tuesday'=>array(), 
    'Wednesday'=>array(), 
    'Thursday'=>array(), 
    'Friday'=>array(), 
    'Saturday'=>array(), 
    'Sunday'=>array() 
); 
    $out = array(); 

    // Put events into temp array, grouped by day 
    foreach ($array as $event) $temp[$event['day']][] = array('event_id'=>$event['event_id'],'time'=>$event['event_id']); 

    // Convert grouped array to the correct format 
    foreach ($temp as $day => $events) if (count($events)) { 
    $index = count($out); 
    foreach ($events as $event) { 
     $out[$index]['event_id'][] = $event['event_id']; 
     $out[$index]['time'][] = $event['time']; 
    } 
    $out[$index]['day'] = $day; 
    } 

    return $out; 

} 

print_r(convert_event_array($myInputArry)); 
2

我倒是建议这种方法,这是完全通用的,可扩展的:

// YOUR INPUT GOES HERE 
$input = (...); 

// Stage 1: group elements of the initial array into sub-arrays based on their 'day' key 
$groupLambda = function($aggr, $val) { 
        $aggr[$val['day']][] = $val; return $aggr; 
       }; 
$grouped = array_reduce($input, $groupLambda, array()); 

// Stage 2: for each "same day" group, make an array of values for each property 
//   instead of an array of items with scalar properties 
$coalesceLambda = function($group) { 
         $mapLambda = function($aggr, $val) { 
          foreach($val as $k => $v) { 
           if($k == 'day') continue; 
           $aggr[$k][] = $v; 
          } 
          return $aggr; 
         }; 
         return array_reduce($group, $mapLambda, array()); 
        }; 
$coalesced = array_map($coalesceLambda, $grouped); 

// Get the result 
print_r($coalesced); 

优点:

  1. 只有一个魔法值(字符串 “天”) ,它可以很容易地变成一个变量,整个事物被分解成一个函数(所以你可以重用这个函数对你想要的任何其他属性进行相同的变换)。
  2. 由于使用内置函数array_reducearray_map而不是手动在PHP中执行相同的工作,应该足够快。

缺点:

  1. 要求PHP> = 5.3由于使用的匿名功能和array_reduce第三个参数。
  2. 不是很容易理解(虽然执行这种数据按摩的代码在任何情况下都不会太容易看见)。