2010-02-06 4 views
10

Gibt es einen Ansatz für das rekursive Verschmelzen von Arrays, wie PHP array_merge_recursive() Funktion funktioniert, außer, dass Integer-Tasten genauso wie String-Schlüssel behandelt werden?PHP array_merge_recursive Verhalten auf Integer-Schlüssel

(Es ist wichtig für den Prozess, der die Schlüssel bleiben Parse-able als ganze Zahlen.)

Zum Beispiel:

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

Wird die auf die "a" Schlüssel und Ausgang verschmelzen, wie erwartet, die folgenden:

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

wenn jedoch ganze Zahlen für Tasten (auch wenn sie als Zeichenfolge):

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

array_merge_recursive() zurückkehren wird:

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

Statt der viel zu wünschen übrig:

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

Gedanken?

Antwort

2

können Sie den Array-Schlüssel mit einem kurzen String prefix:

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

Während dies richtig ist, fühlt es sich zu erfunden. Warum nicht eine normale Schleife? – Ezequiel

3

Ich soulmerge die Idee der Umwandlung mit Hilfe der Tasten durch eine Zeichenfolge hinzufügen. Meine neue Funktion kann jedoch nur 2 Parameter verarbeiten, aber das war der Fall, den Sie hatten, also bin ich damit gegangen. Guck mal.

// 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; 
} 

Und wie sehen die Beispieldaten aus?

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

Und lassen Sie uns versuchen, sie aus:

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

Ihre 'prefixer' und' prefixer' Funktionen müssen überprüfen ob der Wert ein Array ist! Zum Beispiel in der 'prefixer', müssen Sie haben' if (is_array ($ v)) \t \t { \t \t \t $ out [ '_'. $ k] = Präfixer ($ v); \t \t} \t \t sonst \t \t { \t \t \t $ out [ '_'.$ k] = $ v; \t \t} 'innerhalb der Schleife. Sonst klappt es super! – Link14

0

Wenn Sie die Schlüssel wollen als Strings behandelt werden nur machen es reiht ein Präfix hinzuzufügen, wenn Sie es füllen, statt es mit Zahlen zu füllen und dann füllen Sie ein anderes Array auf, nur um es zu bestellen.

0

Diese rekursive Array-Merge-Funktion nummeriert Integer-Schlüssel nicht neu und hängt neue Werte an bestehende ODER fügt ein neues [Schlüssel => Wert] -Paar hinzu, wenn das Paar nicht existiert. Ich nehme an und stelle sicher, dass diese Funktion das ist, was Sie brauchen.

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; 
    } 
Verwandte Themen