2015-08-24 4 views
1

У меня есть следующие 3 многомерные массивы:PHP Merge Многомерные массивы

Array 
(
    [0] => Array 
     (
      [id_produto] => 191 
      [categoria] => 7 
      [prazo] => 8 
      [desconto] => 45 
     ) 

    [1] => Array 
     (
      [id_produto] => 194 
      [categoria] => 7 
      [prazo] => 8 
      [desconto] => 39 
     ) 

    [2] => Array 
     (
      [id_produto] => 195 
      [categoria] => 7 
      [prazo] => 8 
      [desconto] => 39 
     ) 


Array 
(
    [0] => Array 
     (
      [id_produto] => 191 
      [categoria] => 7 
      [pageviews] => 2103 
     ) 

    [1] => Array 
     (
      [id_produto] => 194 
      [categoria] => 7 
      [pageviews] => 2445 
     ) 

    [2] => Array 
     (
      [id_produto] => 195 
      [categoria] => 7 
      [pageviews] => 1560 
     ) 

Array 
(
    [0] => Array 
     (
      [id_produto] => 191 
      [categoria] => 7 
      [pedidos] => 3 
      [valor] => 6501.583023 
     ) 

    [1] => Array 
     (
      [id_produto] => 194 
      [categoria] => 7 
      [pedidos] => 1 
      [valor] => 2217.968420 
     ) 

    [2] => Array 
     (
      [id_produto] => 197 
      [categoria] => 7 
      [pedidos] => 2 
      [valor] => 4405.517706 
     ) 

И я хотел бы объединить их держать клавиши «id_produto» и «CATEGORIA» и есть что-то вроде:

Array 
(
    [0] => Array 
     (
      [id_produto] => 191 
      [categoria] => 7 
      [prazo] => 8 
      [desconto] => 45 
      [pageviews] => 2103 
      [pedidos] => 3 
      [valor] => 6501.583023 
     ) 

    [1] => Array 
     (
      [id_produto] => 194 
      [categoria] => 7 
      [prazo] => 8 
      [desconto] => 39 
      [pageviews] => 2445 
      [pedidos] => 1 
      [valor] => 2217.968420 
     ) 

    [2] => Array 
     (
      [id_produto] => 195 
      [categoria] => 7 
      [prazo] => 8 
      [desconto] => 39 
      [pageviews] => 1560 
      [pedidos] => 2 
      [valor] => 4405.517706 
     ) 

Я пробовал array_merge($array1,$array2,$array3) и array_merge_recursive($array1,$array2,$array3), но он копирует их в массив с 9 элементами. Следующий код работал для меня, но я ищу более быстрое решение, потому что у меня есть тысячи идентификаторов:

foreach($array1 as $arr1=>$a){ 
    foreach($array2 as $arr2=>$b){ 
     if($a['id_produto'] == $b['id_produto']){ 
      $array1[$arr1]['pageviews'] = $b['pageviews']; 
     } 
    } 
    foreach($array3 as $arr3=>$c){ 
     if($a['id_produto'] == $c['id_produto']){ 
      $array1[$arr1]['pedidos'] = $c['pedidos']; 
      $array1[$arr1]['valor'] = $c['valor']; 
     } 
    } 
} 
+0

Вы точно знаете, что все 3 массивов будут в таком же порядке? Ditto Показать код, который вы пробовали, даже если он не работает! – RiggsFolly

+0

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

+0

Я могу заказать их, но не гарантировано, что все идентификаторы будут во всех трех массивах. –

ответ

1

Во-первых, почему ваш код медленный? Предполагая, что у вас 1000 элементов, ваш код выполняет 1000 * (1000 + 1000) = 2 миллиона итераций. Вот почему.

Как это сделать быстрее? Используйте ассоциированные массивы вместо обычных массивов, т. Е. Используйте в качестве ключа id_produto, так что вы можете иметь прямой доступ к правильным элементам вместо того, чтобы делать цикл внутри цикла.

Для этого сначала преобразуйте array2 и array3. Пример с массив2:

$new_array2 = array(); 
foreach ($array2 as $row) { 
    $new_array2[$row['id_produto']] = $row; 
} 
$array2 = $new_array2; 

Затем слить:

foreach ($array1 as & $row) { 
    $row['pageviews'] = $array2[$row['id_produto']['pageviews']]; 
    $row['pedidos'] = $array3[$row['id_produto']['pedidos']]; 
    $row['valor'] = $array3[$row['id_produto']['valor']]; 
} 

Итого: только 3000 итераций.

+0

Спасибо за ответ! –

1

Это может быть полезно:

$merged = array_merge($a, $b, $c); 
$fixed_merge = Array(); 
for($i=0; $i < count($merged); $i++){ 
    echo $i; 
    $this_id = $merged[$i]['id_produto']; 
    if(isset($fixed_merge[$this_id])){ 
     $fixed_merge[$this_id] = array_merge($fixed_merge[$this_id], $merged[$i]); 
    }else{ 
     $fixed_merge[$this_id] = $merged[$i]; 
    } 
} 
print_r($fixed_merge); 
2

Основные ваши массивы, используя id_produto, а затем просто использовать PHP встроенные в функции массива, например

array_replace_recursive($one, $two, $three) 
+0

Спасибо, это самое простое решение без for-s или foreach-s и работает с размером массива – dav

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