我的多维数组合并中怎么会出现 2?

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


$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子:


 Array

    (

        [0] => Array

            (

                [class] => one

                [sub] => 2

            )

    

        [1] => Array

            (

                [class] => two

                [sub] => music

            )

    

    )

这是怎么回事2?我该如何达到预期的结果?谢谢。


动漫人物
浏览 69回答 3
3回答

慕的地10843

array_push返回新数组中的元素数量,而不是更改后的数组,这就是您进入2输出的原因。但这不是您唯一的问题,因为您需要考虑到它$sub也可以是一个数组,在这种情况下,使用array_push将在输出中为您提供一个数组数组。相反,使用array_merge: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        ))3v4l.org 上的演示

手掌心

问题是你使用方法array_push不对。该函数返回数组中的元素数量,而不是数组本身 - 这些项目在第一个参数中添加到数组中,即$class_sub[ $sub['class'] ]你的代码中有这个: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;这里发生的情况是,数组被添加到一起,然后数组项的计数$new( ) 被添加到$class_sub[ $sub['class'] ]。试试这个 - 这不会覆盖$class_sub[ $sub['class'] ],它使用 array_merge 将数组添加在一起(这替换了整个foreach( $subjects as $sub )块,而不仅仅是上面的代码):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);}

慕工程0101907

出于好奇,我编写了您自己的函数版本。因此,这不是对您问题的直接答案,但也许,这里的其他人仍然感兴趣,他们试图按照您指定的方式“合并”数组。function amerge($arr){&nbsp; foreach ($arr as $e){&nbsp; &nbsp; &nbsp;$sub=is_array($e["sub"])?$e["sub"]:array($e["sub"]);&nbsp; &nbsp; &nbsp;foreach ($sub as $s) $p[$e["class"]][$s]=1;&nbsp; &nbsp;}&nbsp; $classes=array_keys($p);&nbsp; foreach ($classes as $c)&nbsp;&nbsp; $out[]=array("class"=>$c,"sub"=>array_keys($p[$c]));&nbsp; return $out;}如需演示,请点击此处: https:&nbsp;//rextester.com/QKULS37967
打开App,查看更多内容
随时随地看视频慕课网APP