2011-12-22 3 views
2

Я пытаюсь получить два массива массивов (я думаю, что это означает, что они многомерные) объединены/объединены общим значением. Другими словами, аналогично оператору JOIN в SQL. Есть ли конкретный, эффективный способ сделать это?Каков наиболее эффективный способ объединения этого массива массивов в PHP?

Попытка объединить эти два:

Array 
(
    [0] => Array 
     (
      [0] => 5 
      [1] => alice 
      [2] => car 
     ) 

    [1] => Array 
     (
      [0] => 3 
      [1] => bob 
      [2] => truck 
     ) 

    [2] => Array 
     (
      [0] => 5 
      [1] => charlie 
      [2] => bike 
     ) 

) 
Array 
(
    [0] => Array 
     (
      [0] => 5 
      [1] => alice 
      [2] => Vancouver 
     ) 

    [1] => Array 
     (
      [0] => 3 
      [1] => bob 
      [2] => Toronto 
     ) 

    [2] => Array 
     (
      [0] => 5 
      [1] => charlie 
      [2] => Portland 
     ) 

) 

Для производства:

Array 
(
    [0] => Array 
     (
      [0] => 5 
      [1] => alice 
      [2] => car 
      [3] => Vancouver 
     ) 

    [1] => Array 
     (
      [0] => 3 
      [1] => bob 
      [2] => truck 
      [3] => Toronto 
     ) 

    [2] => Array 
     (
      [0] => 5 
      [1] => charlie 
      [2] => bike 
      [3] => Portland 
     ) 

) 
+0

Вы хотите «присоединиться к id»? может быть лучше всего, чтобы этот идентификатор был индексом массива. –

+0

также, я предпочитаю, чтобы второй уровень был связан, чтобы не смешивать вещи –

+0

согласен с @eicto - было бы намного проще получить хорошее решение, если бы у вас был массив с именованными ключами, а не [ 1], [2], [3]. Фактически, я бы сказал, что это необходимо для того, чтобы ваша система была надежной. Потому что кто скажет, что не может быть города под названием «Велосипед» или человека под названием «Грузовик»? И если у вас есть какая-либо возможность двусмысленности в данных, то вы не можете использовать ответы, содержащие «array_unique» или «array_merge» и т. Д. – Spudley

ответ

2
foreach ($a as $key => $val) { 
    $result[$key] = array_unique(array_merge($a[$key], $b[$key])); 
} 

Я бы с чем-то вроде этого. Сначала объедините оба массива, а затем отсортируйте повторяющиеся элементы. Это, конечно, требует, чтобы оба массива имели одинаковую длину и числовые знаки.

0

«Оптимально» у вас не было бы двух массивов в первую очередь.

Решение этой конкретных случае:

$a1 = [ 
    [5, 'alice', 'car'], 
    [3, 'bob', 'truck'], 
    [5, 'charlie', 'bike'], 
]; 

$a2 = [ 
    [5, 'alice', 'Vancouver'], 
    [3, 'bob', 'Toronto'], 
    [5, 'charlie', 'Portland'] 
]; 

$a3 = array_map(function($a, $b) { $a[] = $b[2]; return $a; }, $a1, $a2); 

Результаты в (частично):

array(3) { 
    [0] => 
    array(4) { 
    [0] => 
    int(5) 
    [1] => 
    string(5) "alice" 
    [2] => 
    string(3) "car" 
    [3] => 
    string(9) "Vancouver" 
    } 
... 

Если вам не нужно держать $a1 вокруг, вы на самом деле не происходит для получения лучшего решения, чем:

foreach ($a1 as $key => $val) 
    $a1[$key][] = $a2[$key][2]; 
Смежные вопросы