Example #1
0
 /**
  * 递归合并两个或多个数组
  * 本函数内使用for语句,以及func_get_arg函数,实现多个数组递归合并
  * $john = array('name' => 'john', 'children' => array('fred', 'paul', 'sally', 'jane'));
  * $mary = array('name' => 'mary', 'children' => array('jane'));
  *
  * $john = Helper_Array::merge($john, $mary);
  *
  * array('name' => 'mary', 'children' => array('fred', 'paul', 'sally', 'jane'))
  *
  * @param a1 原始数组
  * @param a2 需要合并的数组
  * @return array
  */
 public static function merge(array $a1, array $a2)
 {
     $result = array();
     for ($i = 0, $total = func_num_args(); $i < $total; $i++) {
         $arr = func_get_arg($i);
         $assoc = Helper_Array::isAssoc($arr);
         foreach ($arr as $key => $val) {
             if (isset($result[$key])) {
                 if (is_array($val) && is_array($result[$key])) {
                     if (Helper_Array::isAssoc($val)) {
                         $result[$key] = Helper_Array::merge($result[$key], $val);
                     } else {
                         $diff = array_diff($val, $result[$key]);
                         $result[$key] = array_merge($result[$key], $diff);
                     }
                 } else {
                     if ($assoc) {
                         $result[$key] = $val;
                     } elseif (!in_array($val, $result, true)) {
                         $result[] = $val;
                     }
                 }
             } else {
                 $result[$key] = $val;
             }
         }
     }
     return $result;
 }