为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
动漫人物 2023-10-01 17:21:22
我正在尝试合并多维数组中键的重复值。$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?我该如何达到预期的结果?谢谢。
查看完整描述

3 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

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 上的演示


查看完整回答
反对 回复 2023-10-01
?
手掌心

TA贡献1942条经验 获得超3个赞

问题是你使用方法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);

}


查看完整回答
反对 回复 2023-10-01
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

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


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;

}

如需演示,请点击此处: https: //rextester.com/QKULS37967


查看完整回答
反对 回复 2023-10-01
  • 3 回答
  • 0 关注
  • 64 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信