PHP按值合并数组

问题描述:

我知道这很容易用foreach,然后while - >列表等程序,(我已经完成它),但是我觉得我的代码有点脏,它doesn “T看起来像最好的解决办法...我希望利用本地的PHP阵列功能做到以下几点:PHP按值合并数组

我有两个数组看起来像这样的:

 
[0] (Array)#2 
    [rank] "579" 
    [id] "1" 
[1] (Array)#4 
    [rank] "251" 
    [id] "2" 

[0] (Array)#2 
    [size] "S" 
    [status] "A" 
    [id] "1" 
[1] (Array)#15 
    [size] "L" 
    [status] "A" 
    [id] "2" 

我需要为结果如下:

 
[0] (Array)#2 
    [size] "S" 
    [status] "A" 
    [id] "1" 
    [rank] "579" 

[1] (Array)#2 
    [size] "L" 
    [status] "A" 
    [id] "2" 
    [rank] "251" 

有没有办法能够合并两个数组与id值(或其他),而不会进入无穷无尽的foreach s?

+0

两个数组中的相同索引是否具有相同id的元素?换句话说,如果具有id 5的元素在第一个数组中的索引3处,它是否也会位于第二个数组中的索引3? – deviousdodo

使用array_merge_recursive()

$array = array_merge_recursive($array1, $array2); 

或使自己的功能(可能更快)

function my_array_merge(&$array1, &$array2) { 
    $result = Array(); 
    foreach($array1 as $key => &$value) { 
     $result[$key] = array_merge($value, $array2[$key]); 
    } 
    return $result; 
} 
$array = my_array_merge($array1, array2); 
print_r($array); 
+0

太棒了!,感谢这个,仅供参考:只要您需要丢弃那些不在这两个阵列上重复的记录,函数方法就会非常出色。 –

+5

这在技术上没有回答这个问题。 @OsvaldoM。想要根据id的值而不是按键进行连接。 – Ray

好吧,让我们suppost你的阵列称为$ ARR1和$ ARR2,你可以这样做:

<?php 
$newarray = Array(); 
foreach ($arr1 as $element=>$value){ 
    $newarray = array_merge($arr1[$element],$arr2[$element]) 
} 
?> 

正如Ray在评论中注意到的,接受的答案实际上并没有回答这个问题。我无法找到答案,所以我创建了下面的小工具功能:

function array_merge_callback($array1, $array2, $predicate) { 
    $result = array(); 

    foreach ($array1 as $item1) { 
     foreach ($array2 as $item2) { 
      if ($predicate($item1, $item2)) { 
       $result[] = array_merge($item1, $item2); 
      } 
     } 
    } 

    return $result; 
} 

如下使用它:

array_merge_callback($array1, $array2, function ($item1, $item2) { 
    return $item1['id'] == $item2['id']; 
}); 

有一个很好的一个合并像另一个语言阵列。 这是因为PHP有​​自动编号数组元素,合并将dublicate或用键替换不同的元素。

现在,它已经改变。

// array_fork 
    public static function array_fork() { 
    $args = func_get_args(); 
    $result = array(); 
    foreach ($args as $arr) { 
     is_array($arr) || exit('[' . __METHOD__ . '] Each item must be an array.'); 
     foreach ($arr as $key => $val) { 
     if (is_array($val)) { 
      // recursion 
      !isset($result[$key]) && $result[$key] = array(); 
      $result[$key] = self::array_fork($result[$key], $arr[$key]); 
      continue; 
     } 
     if (is_numeric($key)) { 
      if (!in_array($arr[$key], $result)) 
      $result[] = $arr[$key]; 
     } else 
      $result[$key] = $arr[$key]; 
     } 
    } 
    return $result; 
    } 

function custom_array_merge(&$array1, &$array2) { 
    $result = Array(); 
    foreach ($array1 as $key_1 => &$value_1) { 
     // if($value['name']) 
     foreach ($array2 as $key_1 => $value_2) { 
      if($value_1['name'] == $value_2['name']) { 
       $result[] = array_merge($value_1,$value_2); 
      } 
     } 

    } 
    return $result; 
} 

//通行证$阵列1,& $数组2和改变$ _2 [ '名'] //名在此基础上ü要合并。