将两个二维数组通过共享列值合并
将两个二维数组通过共享列值合并
我知道可以通过使用foreach
,然后使用while
->list等过程轻松实现这一点(我已经完成了),但是我感觉我的代码有点混乱,而且看起来不是最佳解决方案...我希望使用原生的PHP数组函数来完成以下操作:
我有两个数组,看起来像这样:
[ ['rank' => '579', 'id' => '1'], ['rank' => '251', 'id' => '2'], ]
和
[ ['size' => 'S', 'status' => 'A', 'id' => '1'], ['size' => 'L', 'status' => 'A', 'id' => '2'], ]
我需要将它们合并以产生:
[ ['size' => 'S', 'status' => 'A', 'id' => '1', 'rank' => '579'], ['size' => 'L', 'status' => 'A', 'id' => '2', 'rank' => '251'], ]
有没有一种方法可以在不进入无尽的foreach
循环的情况下合并两个数组的id
值(或任何其他值)?
问题的出现原因是需要将两个二维数组按共享列值合并。解决方法可以使用array_merge_recursive()函数或自定义一个函数来实现。
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);
其中,my_array_merge()函数通过循环遍历$array1数组的键值对,将$value和$array2[$key]的值合并到$result[$key]中,最后返回合并后的$result数组。
有人评论说,这个方法并没有准确回答问题,因为他想要根据id的值来进行合并,而不是根据键值对来合并。
问题的出现原因是在一个讨论中,有人指出接受的回答并没有真正回答问题。作者在找不到答案的情况下,创建了一个小的实用函数来解决这个问题。
解决方法是创建一个名为array_merge_callback的函数,它接受两个二维数组和一个断定函数作为参数。函数内部使用foreach循环遍历两个数组中的每个元素,并通过断定函数来判断它们是否具有相同的列值。如果断定函数返回true,则将两个元素合并为一个新的元素,并将其添加到结果数组中。最后,返回结果数组。
使用方法是调用array_merge_callback函数,并传入要合并的两个数组以及一个匿名函数作为参数。匿名函数用来定义断定函数的逻辑,其中判断两个元素的'id'列是否相等。
这个解决方法可以帮助用户将两个具有共享列值的二维数组合并成一个新的数组。
问题:如何通过共享列值合并两个二维数组?
原因:PHP中的数组元素会自动编号,合并操作会导致键值重复或替换不同的元素。
解决方法:使用array_fork()函数实现数组合并操作。该函数的实现如下:
// 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; }
以上代码实现了一个递归函数array_fork(),通过传入多个数组参数进行合并操作。函数遍历每个数组的元素,如果元素是数组,则递归调用array_fork()函数进行合并;如果元素是数字键值,则判断是否已经存在于结果数组中,若不存在则将其添加到结果数组中;如果元素是非数字键值,则直接将其添加到结果数组中。最后返回合并后的结果数组。
通过调用array_fork()函数,可以实现将两个二维数组按照共享列值进行合并的操作。