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

PHP:合并数组并添加键值

PHP:合并数组并添加键值

PHP
鸿蒙传说 2023-04-15 11:02:47
我有一个包含数组的多维数组,每个数组都包含一个artisan和closeness键。我想合并多个数组(如果相同)artisans到一个数组,它是从中合并的数组closeness的值的总和。closeness也就是说,这个数组:Array(    [0] => Array        (            [artisan] => carpenter            [closeness] => 0.8        )    [1] => Array        (            [artisan] => brick layer            [closeness] => 0.4        )    [2] => Array        (            [artisan] => electrician            [closeness] => 0.9        )    [3] => Array        (            [artisan] => carpenter            [closeness] => 0.8            [is_real] => 1        )    [4] => Array        (            [artisan] => brick layer            [closeness] => 0.9            [is_real] => 1        ))应该变成:Array(    [0] => Array        (            [artisan] => carpenter            [closeness] => 1.6 //0.8+0.8        )    [1] => Array        (            [artisan] => brick layer            [closeness] => 1.3  //0.4+0.9        )    [2] => Array        (            [artisan] => electrician            [closeness] => 0.9 //remains 0.9 because it is the only array with artisan value of electrician        )
查看完整描述

2 回答

?
慕仙森

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

试试这个循环


//create new array to hold values in the format you need

$new_array = [];


//loop through old array

foreach($old_array as $arr) {


    $artisan = $arr['artisan'];

    $closeness = $arr['closeness'];


    //check if `$artisan` key does not exists in `$new_array`

    if(!array_key_exists($artisan, $new_array)) {


        //create key in `$new_array` if it doesn't exist already

        //for this key, create an array containing the values in the format you need

        $new_array[$artisan] = [

            'artisan' => $artisan, 

            'closeness' => $closeness

        ];


    } else {


        //increase closeness in `$new_array` with key `$artisan` if key did already exist

        $new_array[$artisan]['closeness'] += $closeness;


    }


}


//replace keys which contain `$artisan` with sequential numbers, as per your expected output.

//if you don't do this, it will still work, but your array keys will be equal to the artisan type.

$new_array = array_values($new_array);

print_r($new_array);

结果:


Array

(

    [0] => Array

        (

            [artisan] => carpenter

            [closeness] => 1.6

        )


    [1] => Array

        (

            [artisan] => brick layer

            [closeness] => 1.3

        )


    [2] => Array

        (

            [artisan] => electrician

            [closeness] => 0.9

        )


)

如果删除该array_values()行,结果将如下所示:


Array

(

    [carpenter] => Array

        (

            [artisan] => carpenter

            [closeness] => 1.6

        )


    [brick layer] => Array

        (

            [artisan] => brick layer

            [closeness] => 1.3

        )


    [electrician] => Array

        (

            [artisan] => electrician

            [closeness] => 0.9

        )


)


查看完整回答
反对 回复 2023-04-15
?
冉冉说

TA贡献1877条经验 获得超1个赞

怎么样:


$results = array(); // create results array


foreach( $array as $k => $i ) {


    $found = false;


    foreach ( $results as $k => $r ) {


        if ( $r[ "artisan" ] == $i[ "artisan" ] ) {


            $results[ $k ][ "closeness" ] += $i[ "closeness" ];


            $found = true;


            break;


        }


    }


    if ( ! $found ) array_push( $results, $i );


}


查看完整回答
反对 回复 2023-04-15
  • 2 回答
  • 0 关注
  • 103 浏览

添加回答

举报

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