2013-06-03 12 views
7

Mam 2 * array i chcę je merge, ale każdy z nich ma pewną wartość: NULLrows.Macierz scalana PHP na wartości zerowej

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

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

Więc, kod:

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

da $ c:

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

Czy tam budować lub prosty sposób zrobić margines ($a,$b) jak następujące, ale teraz $a jest zastępowany przez każdy ten sam indeks z $b. Chcę $b być nadpisane przez $ indeks jeśli $b indeks jest null - na przykład $b['b'] powinno zostać zastąpione od $a

Wszystkie wiersze NULL należy wypełnić, jeśli to możliwe.

Odpowiedz

15

myślę, że można użyć array_filter funkcję usunąć wartości null zarówno w tablicy, a następnie połączyć je

$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); 

Wyjście wola

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

LIVE SAMPLE

Jak marginesie dodam, że za pomocą array_filter bez drugiego parametru trafi do usuwania wszystkich NULL wartości jak EMPTY tablicę itp Jeśli chcesz tylko usunąć NULL wartości więc trzeba będzie użyć array_filter($yourarray, 'strlen');

EDITED

Jeśli chcesz zachować NULL jeśli obie tablice mają go z tym samym kluczem i zakładając, że oba zespoły mają taką samą liczbę kluczy/wartości, a następnie trzeba będzie pętli wewnątrz swojej tablicy i budować nową tablicę konserwujący NULL gdzie potrzebujesz

$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); 

Będzie to wyjście

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

LIVE SAMPLE

+0

Co jeśli nie będzie 'd' wskaźnik zerowy tylko na 1 tablicach. Mam na myśli overwrtie 'nulls' jeśli to możliwe, jeśli nie, powinni zostać. W tym przypadku WSZYSTKIE wartości null zostaną usunięte. – pie6k

+0

@ Kluska000 Zaktualizowałem swoją odpowiedź pasującą do Twojego żądania, sprawdź to na – Fabio

+1

w oparciu o Twoje rozwiązanie, które próbowałem - wydaje się działać i prostsze http://phpfiddle.org/lite/code/rqz-sd4 – pie6k

0

następnie trzeba przejść $ B jako pierwszy parametr

$ c = array_merge ($ B $ a);

można użyć tej funkcji

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

W tym przypadku niezerowy wiersz $ b zostanie nadpisany wierszem zerowym z $ a. Wszystkie wiersze NULL powinny być wypełnione, jeśli to możliwe. – pie6k

+0

Przeczytaj uważnie pytanie. –

+0

funkcja mergeArray ($ array1, $ array2) { $ result = array(); foreach ($ tablica1 jako $ klucz => wartość $) { $ wynik [klucz $] = wartość $; } foreach ($ tablica2 jako $ key => $ value) { if ($ wynik [$ key] == null) { } } } – MjeOsX

0

Jeśli trzeba zachować klucze, które mają wartość NULL w oba tablic, można użyć funkcji niestandardowej, która ignoruje te wpisy z drugiej tablicy, jeśli (i tylko jeśli) istnieje odpowiedni wpis inny niż NULL w pierwszej tablicy.to będzie wyglądać następująco:

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

Patrz także ten short demo.

0

zrobiłbym to z prostego jednej liniowej tak:

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

Byłoby to zachować wszystkie klucze i wartości $b z wyjątkiem gdzie falsey w takim przypadku będą one albo zastąpione wartościami z $a lub jako ostatnia instancja zastąpiona przez null.

Po scaleniu tablic z operatorem + kolejność, w jakiej pojawiają się one od lewej do prawej, jest równoznaczna z pierwszeństwem. Tak więc lewa pozycja utrzyma swoją wartość, chyba że klucz nie istnieje.

Można również odwrócić kolejność i używać array_merge(), ale dla mnie jest to trudniejsze w oczy:

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

Żadna z tych odpowiedzi adres łączących dwie tablice, które mogą mieć różne klucze, która jest co ołowiu do tego postu SO. Zdarza się, aby rzeczywiście być dość proste szczęście:

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

Teraz, łącząc te dwie tablice:

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

z:

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

będzie Produkujemy:

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

Zanotuj tę odpowiedź również rozwiązuje problem dwóch tablic z tymi samymi klawiszami.

Powiązane problemy