PHP的array_merge_recursive函数如何只合并一个数组?

3

我正在处理PHP中的数据结构问题。我试图使用array_merge_recursive将一个数组按照相同的键合并,并获取所有值,而不是让它们被覆盖。这就是为什么我选择array_merge_recursive而不是array_merge

我的数组类似于:

Array
(
  [0] => Array
  (
    [App] => APP1
    [Type] => DB
  )
  [1] => Array
  (
    [App] => APP1
    [Type] => WEBSITE
  )
  [2] => Array
  (
    [App] => APP2
    [Type] => IOS
  )
)

我原本期望array_merge_recursive可以将相同的键合并,并将其他元素分组成数组,但实际效果并非如此。我希望得到以下类似的数组:
Array
(
  [0] => Array
  (
    [App] => APP1
    [Type] => Array
    (
      [0] => DB
      [1] => WEBSITE
    )
  )
  [1] => Array
  (
    [App] => APP2
    [Type] => IOS
  )
)

不是我看到的行为。在你的结果中,你将DB从键Type移动到一个具有键0的子数组中。WEBSITE也是一样。你认为array_merge_recursive是如何工作的呢?请尝试解释您期望的结果背后的逻辑。否则,没有人可以帮忙。 - JustOnUnderMillions
我曾以为array_merge_recursive可以处理一个数组。但是我的假设是错误的。我只是想将“APP”键组合在一起,并保留分配给“TYPE”键的值。 - sconicelli
1个回答

2
array_merge_recursive()并不能满足您的需求。您需要一种根据特定规则重组数组的函数,而这种函数在PHP内置函数中不存在。例如,PHP如何知道您希望新数组按APP还是TYPE进行结构化呢?假设您的数组始终如此简单,那么您想要的最简单版本的函数如下所示:
function sortByApp($array){
    $result = array();
    foreach($array as $row){
        if(!isset( $result[ $row['APP'] ] ) {
            $result[ $row['APP'] ] = array(
                'APP' => $row['APP'],
                'TYPE' => array( $row['TYPE'] ) 
            );
        }else{
            $result[ $row['APP'] ]['TYPE'] = array_merge( $result[ $row['APP'] ]['TYPE'], array($row['TYPE']) );
        }
    }
    $result =  array_values($result); //All this does is remove the keys from the top array, it isn't really necessary but will make the output more closely match what you posted.

    return $result

}

请注意,在此解决方案中,每个APPTYPE键的值始终为数组。我认为这样做可以使稍后处理数据更加容易,因为您不必担心检查字符串与数组之间的区别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接