2013-10-09 2 views
1

У меня есть два многомерные массивы, пример:Как пересечь многомерные массивы без ручной итерации?

array(
    'a' => array(
    'code1' => array('v1', 'v2'), 
    'code2' => array('v1', 'v2') 
), 
    'b' => array(
    'code3' => array('v1', 'v2'), 
    'code4' => array('v1', 'v2'), 
    'code5' => array('v1', 'v2'), 
    'code6' => array('v1', 'v2') 
) 
) 

и

array(
    'a' => array(
    'code1' => '', 
), 
    'b' => array(
    'code5' => '' 
) 
) 

Мой желаемый результат:

array(
    'a' => array(
    'code1' => array('v1', 'v2') 
), 
    'b' => array(
    'code5' => array('v1', 'v2') 
) 
) 

Я уверен, что это может быть возможно с помощью одного встроенного -in php-функции, однако я застрял с ним и не могу найти решение, а не вручную выполнять итерацию через массив. Можете ли вы мне помочь?

+0

Прочтите свой вопрос много раз, чтобы не получить ваш запрос – Nes

+0

Не знаете, почему вы не понимаете мою просьбу. Я дал вам два входных массива и мой желаемый результат. Простые семейные функции array_intersect не будут работать, потому что это многомерный массив. Я хотел бы знать, есть ли какая-либо другая функция, которая могла бы генерировать выходной массив без ручного повторения через массивы. – Marrbacca

+0

@Marrbacca. Что вы подразумеваете под ручной итерацией? Нет встроенной функции для пересечения во всех ситуациях. Иногда вам нужно использовать цикл, и нет ничего «неправильного» в этом. Ответ Джона - это путь. – Boaz

ответ

1

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

$a = array(
    'a' => array(
    'code1' => array('v1', 'v2'), 
    'code2' => array('v1', 'v2') 
), 
    'b' => array(
    'code3' => array('v1', 'v2'), 
    'code4' => array('v1', 'v2'), 
    'code5' => array('v1', 'v2'), 
    'code6' => array('v1', 'v2') 
) 
); 

$b = array(
    'a' => array(
    'code1' => '', 
), 
    'b' => array(
    'code5' => '' 
) 
); 

$result = array(); 
foreach ($a as $key => $data) { 
    $result[$key] = array_intersect_key($data, $b[$key]); 
} 

Идея заключается в том, чтобы использовать array_intersect_key, чтобы сохранить только те элементы от $a, которые появляются (как ключи) в $b.

+0

ключи в обоих массивах всегда будут совпадать - ваше решение намного ближе к тому, что мне нужно, спасибо :). Я также пытался добиться этого, используя функции array_uintersect с обратным вызовом, чтобы удалить каждый foreach. Как вы думаете, это возможно? – Marrbacca

+0

@Marrbacca: Нет, 'array_uintersect' позволяет вам указывать логику сравнения - это не позволяет выполнять пользовательскую обработку. – Jon

+0

вот что я думал, я задал вопрос, чтобы подтвердить. Спасибо за ваше решение, это правильно и отлично работает :) – Marrbacca

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