按键组合两个数组

时间:2015-06-02 21:25:15

标签: php arrays

如何通过键组合两个数组?

例如: -

数组1:

array (
  array (
    'id' => '1',
    'A' => 'ABC'
  ),
  array (
    'id' => '2',
    'A' => 'DEF'
  )
)

数组2:

array (
  array (
    'id' => '2',
    'B' => '456'
  )
  array (
    'id' => '1',
    'B' => '123'
  ),
)

组合数组:

array (
  array (
    'id' => '1',
    'A' => 'ABC',
    'B' => '123'

  ),
  array (
    'id' => '2',
    'A' => 'DEF',
    'B' => '456'
  )
)

组合数组顺序并不重要,但它应该基于提供的字段而不是自然顺序匹配。

我尝试了什么。看起来并不高效。

public function combineArraysByKey($array_1, $array_2, $key = 'id')
{
    $combined_array = array();

    foreach($array_1 as $sub_array_1) {
        foreach($array_2 as $sub_array_2) {
            if ($sub_array_1[$key] == $sub_array_2[$key]) {
                $merged_sub_array = array_merge($sub_array_1, $sub_array_2);
                array_push($combined_array, $merged_sub_array);
            }
        }
    }
    return $combined_array;
}

2 个答案:

答案 0 :(得分:2)

试试这样: -

<?php

$array1 = array (
  array (
    'id' => '1',
    'A' => 'ABC'
  ),
  array (
    'id' => '2',
    'A' => 'DEF'
  )
);

$array2 = array (
  array (
    'id' => '2',
    'B' => '456'
  ),
  array (
    'id' => '1',
    'B' => '123'
  ),
);



function combineArraysByKey($array1, $array2)
{
    foreach($array1 as $key => $value){
        foreach($array2 as $key1 => $value2){
            if($value['id'] === $value2['id']){
                unset($value2['id']);
                $remaining_key = array_keys($value2);
                $array1[$key][$remaining_key[0]] =   $value2[$remaining_key[0]];
            }               
        }
    }
    return $array1;
}
$new_array = combineArraysByKey($array1, $array2);
echo "<pre/>";print_r($new_array);
?>

输出: - https://eval.in/374523

答案 1 :(得分:1)

  

[我的代码]看起来并不高效。

您只需要在两个阵列中的每个阵列上循环一次。

在您的示例函数中,嵌套循环内的代码将运行count($array_1) * count($array_2)次。而在每个阵列上循环一次只会count($array_1) + count($array_2)次。

(显然,当每个阵列中只有2个项目时,数字是相同的,但很快就会节省开支。)

因此,在代码中,替代方案可能是:

$combined_array = array();
foreach(array($array_1, $array_2) as $rows) {
    foreach($rows as $row) {
        $current_key = $row[$key];
        if (array_key_exists($current_key, $combined_array)) {
            $combined_array[$current_key] += $row;
        } else {
            $combined_array[$current_key] = $row;
        }
    }
}
return $combined_array;