2011-08-07 17 views
7

Necesito combinar algunas matrices de alguna manera diferente y utilizo array_merge_recursive. Sin embargo, hay algo que debo cambiar y no sé cómo. Aquí es cita de php.netphp recursive merge

Si, sin embargo, las matrices tienen la misma tecla numérica, el valor más adelante no sobrescribe el valor original, pero se anexará.

Quiero este valor, NO para ser anexado, no quiero agregar valores exactos en la nueva matriz. Espero que hayas entendido esto.

Ejemplo:

$array = array(
    'some' => array(
     'other' => 'key', 
    ), 
); 

$array2 = array(); 
$array2['some']['other'] = 'key2'; 

Si uso array_merge_recursive El resultado será la siguiente:

Array (
    [some] => Array 
     (
      [other] => Array 
       (
        [0] => key 
        [1] => key2 
       ) 
     )) 

quiero si coincide con el mismo resultado, no para añadir it.Yes que conozco, diría , luego usa array_merge, pero tampoco funciona bien. Si uso esto:

$array = array(
    'some' => array(
     'other' => 'key', 
    ), 
); 

$array2 = array(); 
$array2['some']['other2'] = 'key2'; 

print_r(array_merge($array, $array2)); 

Se eliminará $ array [algunos] [otros] de la lista y dejar sólo $ array [algunos] [Otros2] .I no saben lo que es mejor, ya que no se uno lo hace mejor.

+1

¿Qué tan profundo es el anidamiento en su conjunto? Solo un nivel? – hakre

+1

Entonces dinos cuál debería ser tu resultado? – scube

+0

Bueno, puede ser ilimitado. No lo usaré solo para 1 nivel. –

Respuesta

5

probar esto

<?php 
function mymerge(&$a,$b){ //$a will be result. $a will be edited. It's to avoid a lot of copying in recursion 
    foreach($b as $child=>$value){ 
     if(isset($a[$child])){ 
      if(is_array($a[$child]) && is_array($value)){ //merge if they are both arrays 
       mymerge($a[$child],$value); 
      } 
      //else ignore, you can add your own logic, i.e when 1 of them is array 
     } 
     else 
      $a[$child]=$value; //add if not exists 
    } 

    //return $a; 
} 
1

me escribió mi clase de combinación para ello:

<?php 

class ArrayMerge 
{ 

    /** 
    * @param array $a 
    * @param array $b 
    * 
    * @return array 
    */ 
    public function merge ($a, $b) { 
     foreach ($b as $k => $v) { 
      if (is_array($v)) { 
       if (isset($a[ $k ])) { 
        if ($this->isDeep($v)) { 
         $a[ $k ] = $this->merge($a[ $k ], $v); 
        } else { 
         $a[ $k ] = array_merge($a[ $k ], $v); 
        } 
       } else { 
        $a[ $k ] = $v; 
       } 
      } else { 
       $a[ $k ] = $v; 
      } 
     } 
     return $a; 
    } 

    /** 
    * @param array $array 
    * 
    * @return bool 
    */ 
    private function isDeep ($array) { 
     foreach ($array as $elm) { 
      if (is_array($elm)) { 
       return TRUE; 
      } 
     } 
     return FALSE; 
    } 

} 
1

Empecé a partir de la versión de Riad y la manipulación de objetos añadido. Necesidad de pruebas y comentarios

function recursiveMerge(&$a,$b){ //$a will be result. $a will be edited. It's to avoid a lot of copying in recursion 
     if(is_array($b) || is_object($b)){ 
      foreach($b as $child=>$value){ 
       if(is_array($a)){ 
        if(isset($a[$child])) 
         recursiveMerge($a[$child],$value); 
        else 
         $a[$child]=$value; 
       } 
       elseif(is_object($a)){ 
        if(isset($a->{$child})) 
         recursiveMerge($a->{$child},$value); 
        else 
         $a->{$child}=$value; 
       } 
      } 
     } 
     else 
      $a=$b; 
    } 
+0

Gracias compañero. :) –

1

Una otra alternativa, la array_merge_deep de Drupal:

function array_merge_deep($arrays) { 
    $result = array(); 
    foreach ($arrays as $array) { 
    foreach ($array as $key => $value) { 
     // Renumber integer keys as array_merge_recursive() does. Note that PHP 
     // automatically converts array keys that are integer strings (e.g., '1') 
     // to integers. 
     if (is_integer($key)) { 
     $result[] = $value; 
     } 
     // Recurse when both values are arrays. 
     elseif (isset($result[$key]) && is_array($result[$key]) && is_array($value)) { 
     $result[$key] = array_merge_deep(array($result[$key], $value)); 
     } 
     // Otherwise, use the latter value, overriding any previous value. 
     else { 
     $result[$key] = $value; 
     } 
    } 
    } 
    return $result; 
}