2013-06-03 2 views
7

У меня есть 2 * array и я хочу merge их, но каждая из них имеет NULLrows.PHP merge array on nulls

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

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

Итак, код:

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

Даст $ C:

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

Есть ли построить или простой способ сделать запас ($a,$b) как следующий, но теперь $a перезаписаны каждый такой же индекс от $b. Я хочу $b быть перезаписаны $ индекс, если $b индекс null - в примере $b['b'] должны быть переписаны из $a

Все NULL строки должны быть заполнены, если это возможно.

ответ

15

Я думаю, что вы можете использовать array_filter функцию, чтобы удалить нулевые значения в обоих массиве, а затем объединить их

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

Этот выход будет

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

LIVE SAMPLE

Как примечание стороны я хотел бы добавить, что использование array_filter без второго параметра будет в конечном итоге в удалении всех NULL значения, а также EMPTY массив и т.д. Если вы хотите удалить только NULL значения, так что вам нужно будет использовать array_filter($yourarray, 'strlen');

РЕДАКТИРОВАНИЕ

Если вы хотите сохранить NULL, если оба массива имеет его с тем же ключом и предполагая, что оба массива имеет одинаковое количество ключей/значений, то вам нужно будет петля внутри массива и построить новый массив, сохраняющий NULL где вам нужно

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

Это выведет

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

LIVE SAMPLE

+0

Что делать, если там будет 'd' индекс нуль на только 1 из массивов. Я имею в виду перезаписывать «нули», если это возможно, если они не должны оставаться. В этом случае ВСЕ нули будут удалены. – pie6k

+0

@ Kluska000 Я обновил свой ответ, подгоняя ваш запрос, пожалуйста, отметьте его – Fabio

+1

на основе вашего решения. Я пробовал это - кажется, работает и проще http://phpfiddle.org/lite/code/rqz-sd4 – pie6k

0

, то вы должны передать $ Ь в качестве первого параметра

$ с = array_merge ($ Ь $ а);

вы можете использовать эту функцию

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

В этом случае нулевая строка из $ b будет перезаписана нулевой строкой из $ a. Все NULL-строки должны заполняться, если это возможно. – pie6k

+0

Внимательно прочитайте вопрос. –

+0

Функция mergeArray ($ array1, $ array2) { $ result = array(); foreach ($ array1 as $ key => $ value) { $ result [$ key] = $ value; } Еогеасп ($ array2, как $ ключ => $ значение) { если ($ результат [$ ключ] == NULL) { }} } – MjeOsX

0

Если вам необходимо сохранить ключи, которые имеют значение NULL в оба массивов, вы можете использовать пользовательскую функцию, которая игнорирует эти записи из второго массива if (и только если) в первом массиве имеется соответствующая запись, отличная от NULL.Это будет выглядеть следующим образом:

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

См, также, это short demo.

0

Я хотел бы сделать это с помощью простого один лайнер, как это:

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

Это позволит сохранить все ключи и значения $b исключением случаев, когда falsey в этом случае они будут либо заменены значениями из $a или как последнее место заменено на null.

При объединении массивов с оператором + порядок, в котором они отображаются слева направо, соответствует приоритету. Таким образом, крайняя левая позиция будет удерживать ее значение, если ключ не существует.

Вы также можете изменить порядок и использовать array_merge(), но для меня это тяжелее на глазах:

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

Ни один из этих ответов не адресовать сливающихся два массива, которые могут иметь разные ключи, что и свинец меня на эту должность. Это происходит на самом деле быть довольно прямо вперед, к счастью:

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

Теперь, объединение этих двух массивов:

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

с:

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

произведут:

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

Обратите внимание на этот ответ также решает проблему двух массивов с теми же клавишами.