【问题标题】:Merge single array objects by value and preserve duplicates in sub array按值合并单个数组对象并在子数组中保留重复项
【发布时间】:2017-09-25 03:14:28
【问题描述】:

我有以下(简化的)数组:

$myArray = array(
   0=> array( 
      'userid' => '12',
      'favcolor' => 'green'
   ),
   1=> array( 
      'userid' => '62',
      'favcolor' => 'orange'
   ),
   2=> array( 
      'userid' => '12',
      'favcolor' => 'red'
   ),
   3=> array( 
      'userid' => '62',
      'favcolor' => 'blue'
   ),
)

我想通过现有的常见用户 ID 值合并数组并保留最喜欢的颜色信息。我尝试过的其他方法只保留数组中的第一个 favcolor 值。看起来很简单,但找不到快速的解决方案。

预期输出:

$myArray = array(
   0=> array( 
      'userid' => '12',
      'favcolor' => array('green', 'red')
   ),
   1=> array( 
      'userid' => '62',
      'favcolor' => array('orange', 'blue')
   ),
)

如果不使用另一个数组进行比较,这是否可能?

【问题讨论】:

    标签: php arrays sorting merge unique


    【解决方案1】:

    这里我们使用简单的foreach 来合并并达到预期的结果,通过使用这个数组的userid 作为key。这里我们使用array_values 来删除这些密钥。

    Try this code snippet here

    <?php
    
    ini_set('display_errors', 1);
    
    $myArray = array(
       0=> array( 
          'userid' => '12',
          'favcolor' => 'green'
       ),
       1=> array( 
          'userid' => '62',
          'favcolor' => 'orange'
       ),
       2=> array( 
          'userid' => '12',
          'favcolor' => 'red'
       ),
       3=> array( 
          'userid' => '62',
          'favcolor' => 'blue'
       ),
    );
    $result=array();
    foreach($myArray as $value)
    {
        //check for previous existence of key in resultant array
        //if key not exist then put value on that key and using favcolor as array
        if(!isset($result[$value["userid"]]))of key in a array.
        {
            $result[$value["userid"]]=array("userid"=>$value["userid"],"favcolor"=>array($value["favcolor"]));
        }
        //if key already exists then just adding favcolor values to that key
        else
        {
            $result[$value["userid"]]["favcolor"][]=$value["favcolor"];
        }
    }
    print_r(array_values($result));
    

    输出:

    Array
    (
        [0] => Array
            (
                [userid] => 12
                [favcolor] => Array
                    (
                        [0] => green
                        [1] => red
                    )
    
            )
    
        [1] => Array
            (
                [userid] => 62
                [favcolor] => Array
                    (
                        [0] => orange
                        [1] => blue
                    )
    
            )
    
    )
    

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
    • @Rizier123 我正在添加解释
    • 感谢 Sahil,不得不稍作修改,因为出现以下错误:“不能将 stdClass 类型的对象用作数组”。更改代码以使用 $value->userid 而不是 $value["userid"] 并且效果很好。
    • @JackCallow 我投票赞成你的帖子,因为它对我很有用......欢迎...... :)
    【解决方案2】:

    只需如下操作

    // Creating an array for result
    foreach($myArray as $ar){
        if(!isset($aa[$ar['userid']])) $aa[$ar['userid']] = [];
        if(!in_array($ar['favcolor'],$aa[$ar['userid']])) $aa[$ar['userid']][] = $ar['favcolor'];
    }
    
    // Designing it according to result
    foreach($aa as $arr=>$val)
        $last[] =  ['userid'=>$arr,'favcolor'=>$val];
    
    echo '<pre>';
    var_dump($last);
    

    【讨论】:

    • 我们也可以将它放在一个数组上,但为了简单起见,我已经完成了这个..
    猜你喜欢
    • 1970-01-01
    • 2021-06-23
    • 2022-01-03
    • 1970-01-01
    • 2020-04-28
    • 2012-02-26
    • 2014-06-19
    • 1970-01-01
    • 2015-12-27
    相关资源
    最近更新 更多