【问题标题】:PHP: Merge array and add key values [closed]PHP:合并数组并添加键值[关闭]
【发布时间】:2020-05-23 00:50:50
【问题描述】:

我有一个包含数组的多维数组,每个数组都包含一个 artisancloseness 键。如果相同的 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
        )

谢谢

【问题讨论】:

  • 欢迎来到 Stack Overflow! StackOverflow 不是免费的编码服务。你应该try to solve the problem first。请更新您的问题以在minimal reproducible example 中显示您已经尝试过的内容。如需更多信息,请参阅How to Ask,并拨打tour :)
  • 你不是已经问过同样的问题了吗?看到一个类似的问题,也有答案,不过好像被删了。
  • 我不是这方面的专家,可能有办法做到这一点,但我要做的是获得不同的 artisan 并用它们启动一个新数组。然后我将使用 foreach 运行新数组并使用 artisan 值作为索引并运行第一个数组并进行数学运算。
  • @Barmar 对不起,我尝试了很多东西,但都没有奏效,所以我从代码中删除了它们

标签: php arrays


【解决方案1】:

试试这个循环

//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
        )

)

【讨论】:

  • 谢谢...太完美了
  • @Outofthebox 完美,很高兴我能提供帮助。
【解决方案2】:

怎么样:

$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 );

}

【讨论】:

    猜你喜欢
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2017-02-07
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 2014-01-31
    相关资源
    最近更新 更多