2010-02-06 3 views
10

재귀, 제외 그 정수 키 문자열 키와 동일하게 취급된다 않습니다 PHP의 array_merge_recursive() 함수와 같은 방법으로 배열을 병합하는 방법이 있습니까?PHP의 array_merge_recursive 행동

(그것은 키가 구문 분석-수 정수로 남아 프로세스에 대한 중요합니다.) 예를 들어

:

$a = array(
    'a' => array(1) 
); 
$b = array(
    'a' => array(2, 3) 
); 
var_dump(array_merge_recursive($a, $b)); 

"a" 키와 출력에 병합 것, 예상대로, 다음

array(1) { 
    ["a"] => array(3) { 
     [0] => int(1) 
     [1] => int(2) 
     [2] => int(3) 
    } 
} 

을하지만, 키 (심지어 문자열로)에 대한 정수를 사용하는 경우 :

$a = array(
    '123' => array(1) 
); 
$b = array(
    '123' => array(2, 3) 
); 
var_dump(array_merge_recursive($a, $b)); 

array_merge_recursive()를 반환합니다 대신 많은 요구의

array(2) { 
    [0] => array(3) { 
     [0] => int(1) 
    } 
    [1] => array(2) { 
     [0] => int(2) 
     [1] => int(3) 
    } 
} 

:

array(1) { 
    ["123"] => array(3) { 
     [0] => int(1) 
     [1] => int(2) 
     [2] => int(3) 
    } 
} 

생각을?

답변

2

당신은 짧은 문자열로 배열 키를 앞에 수 있습니다 : 나는 문자열을 추가하여 키를 변환 soulmerge의 아이디어를 사용하고

function addPrefix($a) { 
    return '_' . $a; 
} 
# transform keys 
$array1 = array_combine(array_map('addPrefix', array_keys($array1)), $array1); 
$array2 = array_combine(array_map('addPrefix', array_keys($array2)), $array2); 
# call array_combine 
$array = array_merge_recursive($array1, $array2); 
# reverse previous operation 
function stripPrefix($a) { 
    return substr($a, 1); 
} 
$array = array_combine(array_map('stripPrefix', array_keys($array)), $array)  
+1

이것은 정확하지만 너무 실용적입니다. 왜 보통 루프가 아닌가? – Ezequiel

3

. 내 새로운 함수는 2 개의 매개 변수 만 처리 할 수 ​​있지만, 그럴 경우 사용자가 가지고있는 것이므로 그 것이었다. 봐.

// Adds a _ to top level keys of an array 
function prefixer($array) { 
    $out = array(); 
    foreach($array as $k => $v) { 
     $out['_' . $k] = $v; 
    } 
    return $out; 
} 
// Remove first character from all keys of an array 
function unprefixer($array) { 
    $out = array(); 
    foreach($array as $k => $v) { 
     $newkey = substr($k,1); 
     $out[$newkey] = $v; 
    } 
    return $out; 
} 
// Combine 2 arrays and preserve the keys 
function array_merge_recursive_improved($a, $b) { 
    $a = prefixer($a); 
    $b = prefixer($b); 
    $out = unprefixer(array_merge_recursive($a, $b)); 
    return $out; 
} 

그리고 샘플 데이터가 무엇인지처럼 보이는?

// some sample data  
$a = array(
    '123' => array(1) 
); 
$b = array(
    '123' => array(2, 3) 
); 

// what do the results say:  
print_r($a); 
// Array 
// (
//  [123] => Array 
//   (
//    [0] => 1 
//  ) 
// 
//) 

print_r($b); 
// Array 
// (
//  [123] => Array 
//   (
//    [0] => 2 
//    [1] => 3 
//  ) 
// 
//) 

와의 그들을 밖으로 시도하자 : 당신은 키가 문자열로 취급하려면

print_r(array_merge_recursive($a, $b)); 
// Array 
// (
//  [0] => Array 
//   (
//    [0] => 1 
//  ) 
// 
//  [1] => Array 
//   (
//    [0] => 2 
//    [1] => 3 
//  ) 
// 
//) 

print_r(array_merge_recursive_improved($a, $b)); 
// Array 
// (
//  [123] => Array 
//   (
//    [0] => 1 
//    [1] => 2 
//    [2] => 3 
//  ) 
// 
//) 
+1

'prefixer'와'unprefixer' 함수는 값이 배열인지 확인해야합니다! 예를 들어,'prefixer', 당신은'이 필요하면 (는 is_array ($ V)) \t \t { \t \t \t $ 밖으로 [ '_'. $ k] = 접두어 ($ v); \t \t} 다른 \t \t { \t \t \t \t \t $ 밖으로 [ '_'.$ k] = $ v; \t \t}'루프 내부. 그렇지 않으면 잘 작동합니다! – Link14

0

그냥 당신이 그것을 채울 때 접두사를 추가을 문자열 만들기, 숫자를 채우기 위해 대신하고 그런 다음 다른 어레이를 다시 채우고 주문하십시오.

0

이 재귀 배열 병합 함수는 정수 키의 번호를 다시 매기거나 기존 값에 새로운 값을 추가하지 않거나 쌍이 존재하지 않으면 새로운 [key => value] 쌍을 추가합니다. 나는이 기능이 당신이 필요로하는 것임을 확신하고 있습니다.

function array_merge_recursive_adv(array &$array1, $array2) { 
     if(!empty($array2) && is_array($array2)) 
      foreach ($array2 as $key => $value) { 
        if(array_key_exists($key,$array1)) { 
         if(is_array($value)){ 
          array_merge_recursive_adv($array1[$key], $value); 
         } else { 
          if(!empty($array1[$key])) { 
           if(is_array($array1[$key])){ 
            array_push($array1[$key], $value); 
           } else { 
            $array1[$key] = [$array1[$key]]; 
            $array1[$key][] = $value; 
           } 
          } else if(empty($array1[$key])) { 
           $array1[$key] = $value; 
          } 
         } 
        } else { 
         $array1[$key] = $value; 
        } 
      } 
      return $array1; 
    }