【问题标题】:PHP associative array merge with unique valuesPHP关联数组与唯一值合并
【发布时间】:2018-01-25 06:00:22
【问题描述】:

我有一个看起来像这样的数组

$array=Array ( [0] => Array ( [Country] => United Arab Emirates [users] => 2 )
        [1] => Array ( [Country] => Albania [users] => 1 ) 
        [2] => Array ( [Country] => Armenia [users] => 4 ) 
        [3] => Array ( [Country] => Argentina [users] => 12 )
        [4] => Array ( [Country] => United Arab Emirates [users] => 3 ) 
        [5] => Array ( [Country] => Austria [users] => 1 ) 
        [6] => Array ( [Country] => Austria [users] => 8 ) 
        [7] => Array ( [Country] => Austria [users] => 1 ) )

如果第一个值相同,我想添加第二个值。 我试过 array_unique($array) 但如果第一个值相同,则无法添加第二个值。

所以我期望的输出是

Array ( [0] => Array ( [Country] => United Arab Emirates [users] => 5 )
        [1] => Array ( [Country] => Albania [users] => 1 ) 
        [2] => Array ( [Country] => Armenia [users] => 4 ) 
        [3] => Array ( [Country] => Argentina [users] => 12 )
        [4] => Array ( [Country] => Austria [users] => 10 ))

我尝试如下但无法解决

$array=array_unique($array)
and 
        foreach ($array as $unique){
            if( in_array( $unique['Country'] ,$array) )
            {
                print_r ($unique['Country']);
            }
        }

你能帮帮我吗?

【问题讨论】:

    标签: php multidimensional-array associative-array


    【解决方案1】:

    你可以使用array_reduce,比如:

    $sum = array_reduce($data, function ($a, $b) {
        isset($a[$b['Country']]) ? $a[$b['Country']]['users'] += $b['users'] : $a[$b['Country']] = $b;  
        return $a;
    });
    
    
    echo "<pre>"; print_r(array_values($sum));
    

    【讨论】:

      【解决方案2】:

      您可以为此做一个 经典 foreach 循环:

      $result = array();
      
      foreach( $array as $value ){
          if( !isset( $result[ $value[ "Country" ] ] ) ) $result[ $value[ "Country" ] ] = $value;
          else $result[ $value[ "Country" ] ][ "users" ] += $value[ "users" ];
      }
      
      $result = array_values($result);
      

      这将导致:

      Array
      (
          [0] => Array
              (
                  [Country] => United Arab Emirates
                  [users] => 5
              )
      
          [1] => Array
              (
                  [Country] => Albania
                  [users] => 1
              )
      
          [2] => Array
              (
                  [Country] => Armenia
                  [users] => 4
              )
      
          [3] => Array
              (
                  [Country] => Argentina
                  [users] => 12
              )
      
          [4] => Array
              (
                  [Country] => Austria
                  [users] => 10
              )
      
      )
      

      【讨论】:

        【解决方案3】:

        您可以简单地遍历第一个数组并自己总结它们:

        $array = [
            [ "Country" => "United Arab Emirates", "users" => 2 ],
            [ "Country" => "Albania", "users" => 1 ], 
            [ "Country" => "Armenia", "users" => 4 ], 
            [ "Country" => "Argentina", "users" => 12 ],
            [ "Country" => "United Arab Emirates", "users" => 3 ], 
            [ "Country" => "Austria", "users" => 1 ], 
            [ "Country" => "Austria", "users" => 8 ], 
            [ "Country" => "Austria", "users" => 1 ], 
         ];
        
         $new = [];
        
         foreach ($array as $item) {
             // Check if we already have added the country to the new array
             if (empty($new[$item['Country']])) {
                 // The country doesn't exist, add it
                 $new[$item['Country']] = ['Country' => $item['Country'], 'users' => 0]; 
             }
        
             // Add the amount of users
             $new[$item['Country']]['users'] += $item['users'];
         }
        
         // Since we used the country as key, we can use array_values() 
         // to get it as an array with numeric indexes again.
         $new = array_values($new);
        

        演示:https://3v4l.org/ZuUoL

        【讨论】:

          【解决方案4】:

          你可以用这个方法变得独一无二

          array_unique($associativeArray,SORT_REGULAR);
          

          使用名称和年龄键定义关联数组 $associativeArray

           $associativeArray[] = array("name" => "pankaj Singh","no"=>4);
           $associativeArray[] = array("name" => "pankaj Singh","no"=>24);
          

          【讨论】:

            【解决方案5】:

            你可以使用PHP函数

                in_array()
            

            试试这个

              $array=array();
              foreach($array as $k=>$v){
              foreach($v as $key=>$value){
                if(!in_array($value, $array)){
                $array[]=$value;
                }
              }
             }
            

            【讨论】:

              【解决方案6】:

              试试这个。我希望这会对你有所帮助:

              $country_users = array();
              foreach ($array as $each) {
                  $value = $each['users'];
                  if (array_key_exists($each['Country'], $country_users)) {
                      $prev_users = $country_users[$each['Country']];
                      $value = $each['users'] + $prev_users;
                  }
                  $country_users[$each['Country']] = $value;
              }
              unset($array);
              foreach ($country_users as $country=>$users) {
                  $array[] = array('Country' => $country, 'users' => $users);
              }
              echo '<pre>';
              print_r($array);
              

              【讨论】:

                【解决方案7】:

                您将通过以下代码获得结果:

                $request = array();
                    foreach ($yourArray as $key => $value) {
                      if (!in_array($value['country'], $request)) {
                        $request[] = $value['country'];
                      }
                      else {
                        unset($yourArray[$key]);
                      }
                    }
                    print_r($yourArray);
                

                【讨论】:

                  【解决方案8】:

                  您可以简单地使用array_merge_recursive()array_unique()in_array() 函数。正如您在上面看到的建议。但我的建议是更改数组结构(如果可能的话)以将关联数组与国家名称作为键并计为值。操作和理解会更加简单明了。

                  $array = [
                      'Austria' => 12,
                  ];
                  

                  您可以稍后根据需要更改数组结构以进行响应。但是我相信使用键值结构操作可以帮助您避免很多麻烦。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2013-02-09
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-05-13
                    • 1970-01-01
                    • 2011-10-12
                    • 1970-01-01
                    • 2012-10-21
                    相关资源
                    最近更新 更多