Допустим, у меня есть два массива:
$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,
),
);
Это ошибка?
Попробуй это:
<?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.
Проанализируйте внимательно, и вы поймете, что хотите объединить 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
)
)
@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,
)