Php 我的多维数组合并中的2是如何出现的?

Php 我的多维数组合并中的2是如何出现的?,php,arrays,Php,Arrays,我正在尝试合并多维度数组中键的重复值 $subjects = array( array( 'class' => 'one', 'sub' => 'music', ), array( 'class' => 'one', 'sub' => array( 'social', 'health', 'science' ), ),

我正在尝试合并多维度数组中键的重复值

$subjects = array(
       array(
           'class' => 'one',
           'sub' => 'music',
       ),
           array(
           'class' => 'one',
           'sub' => array( 'social', 'health', 'science' ),
       ),
          array(
           'class' => 'two',
           'sub' => 'music',
       ),
           
           array(
           'class' => 'one',
           'sub' => 'math',
       )    
    );
在上面,我需要找到公共类并将它们的子类合并到一个数组中。因此,预期输出如下所示:

 Array
    (
        [0] => Array
            (
                [class] => one
                [sub] => array( 'music', 'social', 'health', 'science', 'math' )
            )
    
        [1] => Array
            (
                [class] => two
                [sub] => music
            )
    
    )
我正试图得到那个结果,但我不知从哪里得到了
2

    $class_sub = array();
    $result = array();
    
    foreach( $subjects as $sub ) {
        if ( ! isset( $class_sub[ $sub['class'] ] ) ) {
            $class_sub[ $sub['class'] ] = $sub['sub'];
        } else {
            if ( is_array( $class_sub[ $sub['class'] ] ) ) {
                $new = array_push( $class_sub[ $sub['class'] ], $sub['sub'] );
            } else {
                $new[] = $sub['sub'];
            }
            
            $class_sub[ $sub['class'] ] = $new;
        }
    }
    
    foreach( $class_sub as $class => $sub ) {
        $result[] = array(
            'class' => $class,
            'sub' => $sub
        );
    }
    
echo "<pre>"; print_r( $result ); echo "</pre>";

    

如何实现
2
以及如何实现期望的结果?谢谢。

问题是您使用不正确。函数返回数组中的元素数,而不是数组本身-在第一个参数中将项目添加到数组中,即
$class\u sub[$sub['class']]]

您的代码中包含以下内容:

foreach( $subjects as $sub ) {
    /* prepare subjects as an array */
    if ( is_array( $sub['sub'] ) )  $subjects = $sub['sub'];
    else                            $subjects = array($sub['sub']);

    if ( ! isset( $class_sub[ $sub['class'] ] ) )
        /* if this is the first subject for this class, there is no array to merge with */
        $class_sub[ $sub['class'] ] = $subjects; 
    else 
        /* We know both class and subject are arrays so we can merge them */
        $class_sub[$sub['class']] = array_merge( $class_sub[ $sub['class'] ], $subjects);
}
这里发生的事情是数组被添加到一起,然后数组项的计数(
$new
)被添加到
$class\u sub[$sub['class']]

请改为尝试此操作-这不会覆盖
$class\u sub[$sub['class']]]
,它使用数组合并将数组添加到一起(这将替换整个
foreach($subject as$sub)
块,而不仅仅是上面的代码):

返回新数组中的元素数,而不是更改的数组,这就是为什么在输出中得到
2
。这不是您唯一的问题,因为您需要考虑到
$sub
也可以是一个数组,在这种情况下,使用
array\u push
将在输出中为您提供一个数组。相反,请使用:

示例数据的输出:

function amerge($arr){
  foreach ($arr as $e){
     $sub=is_array($e["sub"])?$e["sub"]:array($e["sub"]);
     foreach ($sub as $s) $p[$e["class"]][$s]=1;
   }
  $classes=array_keys($p);
  foreach ($classes as $c) 
  $out[]=array("class"=>$c,"sub"=>array_keys($p[$c]));
  return $out;
}

出于好奇,我编写了自己版本的函数。因此,这不是对您的问题的直接回答,但是,这里的其他人可能仍然感兴趣,他们正试图以您指定的方式“合并”数组

有关演示,请单击此处:

foreach( $subjects as $sub ) {
    /* prepare subjects as an array */
    if ( is_array( $sub['sub'] ) )  $subjects = $sub['sub'];
    else                            $subjects = array($sub['sub']);

    if ( ! isset( $class_sub[ $sub['class'] ] ) )
        /* if this is the first subject for this class, there is no array to merge with */
        $class_sub[ $sub['class'] ] = $subjects; 
    else 
        /* We know both class and subject are arrays so we can merge them */
        $class_sub[$sub['class']] = array_merge( $class_sub[ $sub['class'] ], $subjects);
}
if ( is_array( $class_sub[ $sub['class'] ] ) ) {
    $new = array_merge( $class_sub[ $sub['class'] ], is_array($sub['sub']) ?  $sub['sub'] : array($sub['sub']));
} else {
    $new = array_merge( array($class_sub[ $sub['class'] ]),  is_array($sub['sub']) ?  $sub['sub'] : array($sub['sub']));
}
Array
(
    [0] => Array
        (
            [class] => one
            [sub] => Array
                (
                    [0] => music
                    [1] => social
                    [2] => health
                    [3] => science
                    [4] => math
                )    
        )
    [1] => Array
        (
            [class] => two
            [sub] => music
        )
)
function amerge($arr){
  foreach ($arr as $e){
     $sub=is_array($e["sub"])?$e["sub"]:array($e["sub"]);
     foreach ($sub as $s) $p[$e["class"]][$s]=1;
   }
  $classes=array_keys($p);
  foreach ($classes as $c) 
  $out[]=array("class"=>$c,"sub"=>array_keys($p[$c]));
  return $out;
}