2013-05-10 3 views
0

Это должно быть очень простой ответ, и я, наверное, просто быть толстым, но у меня есть два массива в PHP:Рекурсивный объединить два массива, или заменить последний на основе ключа

$data1 = array(
    array(
    'qid' => 'q-prof-1-1', 
    'value' => 10, 
), 
    array(
    'qid' => 'q-prof-2-1', 
    'value' => 3, 
), 
); 
$data2 = array(
    array(
    'qid' => 'q-prof-2-1', 
    'value' => 5, 
), 
    array(
    'qid' => 'q-prof-3-2', 
    'value' => 1, 
), 
); 

И я хочу чтобы привести:

$result = array(
    array(
    'qid' => 'q-prof-1-1', 
    'value' => 10, 
), 
    array(
    'qid' => 'q-prof-2-1', 
    'value' => 5, 
), 
    array(
    'qid' => 'q-prof-3-2', 
    'value' => 1, 
), 
); 

... так что два будет merged-, но, если он находит QID, соответствующий другому, заменит его последним.

Я попробовал смесь array_merge(), array_merge_recursive(), $data1 + $data2, $data2 + $data1, array_replace(), array_replace_recursive(), array_diff() и т.д., и т.д., но каждые варианты, кажется, возвращает два или четыре значения, а не три. И, конечно же, я сделал свою долю в охоте на S.O.

Любые идеи? Предпочитаете что-то короткое и сладкое для массивной итерирующей функции любого рода!

Заранее спасибо :) Matt

Edit:

Я просто понял, что если я поворачиваю массивы внутри $ data1 & $ data2 в пар ключ-значение большинство из них сливаются и заменяющие функции работают, например:

$data1 = array(
    'q-prof-1-1' => array(
    'qid' => 'q-prof-1-1', 
    'value' => 10, 
) // ... etc etc 
); 

... но я бы до сих пор, а не менять исходные данные

ответ

0

Есть ли причина, по которой вы не можете использовать ассоциативный массив? Таким образом, вы можете просто

$array = array('q-prof-1-1' => 10, 'q-prof-2-1' => 3); 
$array2 = array('q-prof-2-1' => 5, 'q-prof-3-2' => 1); 

Тогда просто цикл через $ массив2, нажмите значение в случае $ массив не имеет ключа (key_exists(), если я правильно помню), или если он имеет ключевое слияние их, как вы хотите?

Кроме того, но не уверен, использование ассоциативного массива, вероятно, сделает работу array_merge корректной (возможно).

+0

Эй, спасибо за ваш ответ. Я только что редактировал свой вопрос, прежде чем увидел ваш комментарий, но да, он работает с ассоциативными массивами. Однако я бы предпочел не менять исходные данные! –

+0

hahaha, и я думаю, я не видел твоих прав. Этот ответ выглядит так: http://stackoverflow.com/questions/7819003/merge-two-arrays-with-the-same-key-but-in-different-depth?rq=1. В противном случае я думаю, что вы застряли в написании собственного рекурсивного массива_merge. Вы можете указать свою собственную функцию для слияния, как в ответе выше. И затем оттуда. Причините боль, сохраняя исходную структуру данных. – Fooldj

Смежные вопросы