2013-06-03 8 views
7

Ich habe 2 * array und ich möchte merge ihnen, aber jedes Thema haben einige NULLrows.PHP merge Array auf Nullen

$a = array(
    'a' => NULL, 
    'b' => 1, 
    'c' => 1 
); 

$b = array(
    'a' => 1, 
    'b' => NULL, 
    'c' => 1  
); 

So Code:

$c = array_merge($a,$b); 

Will $ c geben:

array { 
    'a'=> 1 
    'b'=> NULL 
    'c'=>1 
} 

Gibt es bauen oder einfache Art und Weise Spielraum zu tun ($a,$b) wie folgt, aber jetzt wird $a überschrieben für jeder gleiche Index von $b. Ich möchte $b von $ einen Index überschrieben werden, wenn $b Index null ist - in Beispiel $b['b'] überschrieben werden soll von $a

Alle NULL Zeilen, wenn möglich gefüllt werden soll.

Antwort

15

Ich glaube, Sie array_filter Funktion können NULL-Werte in beiden Arrays entfernen und sie dann verschmelzen

$a = array(
    'a' => NULL, 
    'b' => 1, 
    'c' => 1 
); 

$b = array(
    'a' => 1, 
    'b' => NULL, 
    'c' => 1  
); 

$b = array_filter($b); 
$a = array_filter($a); 
$c = array_merge($a, $b); 
var_dump($c); 

Dies wird Ausgang

array(3) { 
    ["b"]=> int(1) 
    ["c"]=> int(1) 
    ["a"]=> int(1) 
} 

LIVE SAMPLE

Als Randbemerkung möchte ich, daß array_filter ohne zweite Parameter mit Hilfe von Add wird in das Löschen aller NULL Werte sowie EMPTY Array usw. am Ende Wenn Sie nur NULL Werte entfernen möchten, so dass Sie array_filter($yourarray, 'strlen');

verwenden müssen, EDITED

wenn Sie NULL zu erhalten, wenn beide Arrays mit dem gleichen Schlüssel haben und unter der Annahme, dass beide Arrays gleiche Anzahl von Tasten/Werte haben, dann sind Sie in der Schleife in Ihrem Array benötigen und ein neues Array bauen NULL konservieren wo Sie brauchen

$a = array(
    'a' => NULL, 
    'b' => 1, 
    'c' => 1, 
    'd' => NULL 
); 

$b = array(
    'a' => 1, 
    'b' => NULL, 
    'c' => 1, 
    'd' => NULL, 
); 

$c = array(); 
foreach($a as $key => $val) 
{ 
    if($key == NULL && $b[$key] == NULL) 
    { 
     $c[$key] = $val; 
    } else if($key != NULL && $b[$key] == NULL) { 
     $c[$key]= $val; 
    } else if($key != NULL && $b[$key] != NULL) { 
     $c[$key]= $b[$key]; 
    } else { 
     $c[$key]= $b[$key]; 
    } 
} 
var_dump($c); 

Dies wird Ausgang

array (size=4) 
    'a' => int 1 
    'b' => int 1 
    'c' => int 1 
    'd' => NULL 

LIVE SAMPLE

+0

Was ist, wenn es wird 'd' Null-Index auf nur 1 von Arrays. Ich meine, ich übertreibe 'Nullen' wenn möglich, wenn sie nicht bleiben sollten. In diesem Fall werden alle Nullen entfernt. – pie6k

+0

@ Kluska000 Ich habe meine Antwort passend zu Ihrer Anfrage aktualisiert, bitte überprüfen Sie es – Fabio

+1

basierend auf Ihrer Lösung Ich habe es versucht - scheint zu arbeiten und einfacher http://phpfiddle.org/lite/code/rqz-sd4 – pie6k

0

dann muss man $ b als ersten Parameter übergeben

$ c = array_merge ($ b, a $);

können Sie diese Funktion verwenden

function mergeArray($array1, $array2) 
{ 
    $result = array(); 

    foreach ($array1 as $key=>$value) 
    { 
     $result[$key] = $value; 
    } 

    foreach ($array2 as $key=>$value) 
    { 
     if (!isset($result[$key] || $result[$key] == null) 
     { 
      $result[$key] = $value; 
     } 
    } 

    return $result; 
} 
+0

In diesem Fall wird nicht null Zeile von $ b durch Nullzeile von $ a überschrieben. Alle NULL-Zeilen sollten gefüllt werden, wenn möglich. – pie6k

+0

Lesen Sie die Frage sorgfältig durch. –

+0

Funktion mergeArray ($ array1, $ array2) { $ result = array(); foreach ($ array1 als $ key => $ value) { $ result [$ key] = $ value; } foreach ($ array2 wie $ key => $ value) { if ($ result [$ key] == null) { } } } – MjeOsX

0

Wenn Sie Schlüssel müssen erhalten, die einen Wert von NULL in beide Arrays haben, können Sie eine benutzerdefinierte Funktion verwenden, die diese Einträge ignoriert aus dem zweiten Array if (und nur wenn) gibt es einen entsprechenden Nicht-NULL-Eintrag im ersten Array.Es würde wie folgt aussehen:

function arrayMergeIgnoringNull($arr1, $arr2) { 
    $new2 = array(); 
    forEach ($arr2 as $key => $value) { 
     if (($value !== NULL) || !isSet($arr1[$key])) { 
      $new2[$key] = $value; 
     } 
    } 
    return array_merge($arr1, $new2); 
} 
$c = arrayMergeIgnoringNull($a, $b); 

See, auch diese short demo.

0

ich es tun würde mit einem einfachen Motto wie folgt aus:

$c = array_filter($b) + array_filter($a) + array_fill_keys(array_keys($b),null); 

Dies würde erhalten alle Schlüssel und Werte von $b sofern Falsey in diesem Fall werden sie entweder mit den Werten aus $a oder als ersetzt werden letzter Ausweg ersetzt durch null.

Beim Zusammenführen von Arrays mit dem Operator + entspricht die Reihenfolge, in der sie von links nach rechts angezeigt werden, der Priorität. Die linke Position behält also ihren Wert, es sei denn, der Schlüssel existiert nicht.

Sie können auch die Reihenfolge umkehren und array_merge() verwenden, aber für mich ist es schwieriger, auf die Augen:

$c = array_merge(array_fill_keys(array_keys($b),null) + array_filter($a) + array_filter($b)); 
1

Keine dieser Antworten zwei Arrays addressregisted verschmelzenden die verschiedene Schlüssel haben können, was was Blei Ich zu diesem SO Post. Es passiert eigentlich ziemlich gerade sein nach vorne zum Glück:

function arrayMergeIfNotNull($arr1, $arr2) { 
    foreach($arr2 as $key => $val) { 
     $is_set_and_not_null = isset($arr1[$key]); 
     if ($val == NULL && $is_set_and_not_null) { 
      $arr2[$key] = $arr1[$key]; 
     } 
    } 
    return array_merge($arr1, $arr2); 
} 

nun die Verschmelzung dieser beiden Arrays:

$a = array('a' => NULL, 'b' => 1, 'c' => 1, 'd' => NULL, 'z' => 'zebra'); 
$b = array('a' => 1, 'b' => NULL, 'c' => 1, 'd' => NULL, 'f' => 'frank'); 

mit:

var_dump(arrayMergeIfNotNull($a, $b)); 

produzieren:

array (size=6) 
    'a' => int 1 
    'b' => int 1 
    'c' => int 1 
    'd' => NULL 
    'z' => 'zebra' 
    'f' => 'frank' 

Beachten Sie diese Antwort auch löst das Problem von zwei Arrays mit den gleichen Schlüsseln.