array_merge два аналогичных массива: отключение правой части приводит к тому, что левая часть не отображается

Допустим, у меня есть два массива:

$a = array(
'product' => array(
'name' => "Some Product Name",
'description' => 'Some Product Description',
'productLink' => 'some.uri.url'
)
);

$b = array(
'product' => array(
'name' => 'Some Product Name',
'description' => 'Some other Description',
'price' => 10.95,
'tax' => 0.08,
)
);

Я хочу объединить эти два массива, но хочу сохранить сторону $ a в отношении имени и описания. Я предполагаю:

unset($b['product']['name']);
unset($b['product']['description']);
$c = array_merge($a, $b);

должно привести к:

$c = array(
'product' => array(
'name' => "Some Product Name",
'description' => 'Some Product Description',
'productLink' => 'some.uri.url',
'price' => 10.95,
'tax' => 0.08,
)
);

я вижу это:

$c = array (
'product' => array (
'price' => 10.95,
'tax' => 0.08,
),
);

Это ошибка?

0

Решение

Попробуй это:

<?php

$a = array(
'product' => array(
'name' => "Some Product Name",
'description' => 'Some Product Description',
'productLink' => 'some.uri.url'
)
);

$b = array(
'product' => array(
'name' => 'Some Product Name',
'description' => 'Some other Description',
'price' => 10.95,
'tax' => 0.08,
)
);

unset($b['product']['name']);
unset($b['product']['description']);
$c = array_merge($a['product'], $b['product']);

print_r($c);

Я думаю, что когда вы объединяете, он переопределяет на первом уровне … Так что «продукт» из $ b переопределяет «продукт» из $ a.

0

Другие решения

Проанализируйте внимательно, и вы поймете, что хотите объединить product ключ обоих массивов, а не сами массивы, так что это должно работать (обратите внимание, я поменял местами $b первый и $a второй, так что значения $a иметь приоритет):

$c['product'] = array_merge($b['product'],$a['product']);
print_r($c);

Печать:

Array
(
[product] => Array
(
[name] => Some Product Name
[description] => Some Product Description
[productLink] => some.uri.url
[price] => 10.95
[tax] => 0.08
)

)
0

@koala_dev, вы правы, я хотел объединить эти ключи, но это было крошечное подмножество массивов и вложенных массивов гораздо большего набора данных, который я должен заменить. В моем исследовании и тестировании (теперь, когда я выспался), array_merge будет объединять только первый уровень массивов слева направо с заменой массивов на первую перезапись, но без рекурсивной перезаписи.

array_merge_recursive тоже не работал, потому что если бы он нашел два одинаковых ключа, он создал бы другой массив с этими ключами, когда структура массива критична.

array_replace_recursive Действительно делает то, что я хотел с одной оговоркой: если массивы имеют числовые ключи, значения второго массива заменят цифровые клавиши левого массива:

$ab = array('one' => 1, 'two' => 2, 'three' => 3);
$cd = array(1, 2, 3);
$ef = array('one' => 10, 'two' => 3, 'four' => 40);
$zz = array_replace_recursive($ab, $cd, $ef);

приведет к:

array (
'one' => 10,
'two' => 3,
'three' => 3,
0 => 1,
1 => 2,
2 => 3,
'four' => 40,
)
0
По вопросам рекламы [email protected]