【问题标题】:PHP array merge elements with same keyPHP数组合并具有相同键的元素
【发布时间】:2021-12-09 16:00:55
【问题描述】:

这不是以下问题的重复:

我需要合并 PHP 数组中的项目,这里是我需要合并具有相同 UID 的项目的示例:

  0 => 
    array (size=10)
      'id' => '958'
      'uid' => '385'
      'text' =>  '2021-10-23 08:32:35'
  1 => 
    array (size=10)
      'id' =>  '956'
      'uid' => '385'
      'text' => '2021-10-23 08:31:51'

  2 => 
    array (size=10)
      'id' => '957'
      'uid' => '386' 
      'timestamp' => '2021-10-23 08:32:12' 

  3 => 
    array (size=10)
      'id' => '955'
      'uid' => '385' 
      'timestamp' => '2021-10-23 08:31:38'

元素0、1、3具有相同的UID,因此合并相同UID的元素后的预期数组为:

  0 => 
    array (size=10)
      'id' => '958'
      'uid' => '385'
      'text' =>  '2021-10-23 08:32:35'

  1 => 
    array (size=10)
      'id' => '957'
      'uid' => '386' 
      'timestamp' => '2021-10-23 08:32:12' 

我需要保留最小键的项目。

【问题讨论】:

  • 也就是说,删除重复项?
  • 不是真的,只复制一个键:UID(文字不一样。我清楚了吗?
  • 为什么有时会有文本和其他时间戳?你在结果数组中放入了什么 id 和文本?
  • 我猜,当你说“合并”这个词时,你想使用两个数组。但根据问题,它似乎删除了重复项。在底部它说你只需要最小的物品。这三个都是三个不同的方面
  • 如果您只想保留数组中最小的项目。然后只需对其进行排序并从头开始保存。如果要删除相同的 UUID 值,则可以删除重复项

标签: php arrays merge


【解决方案1】:

正如已经说过的,有很多解决方案可以解决这个问题。

我认为函数array_reduce 适合这种情况。

这是您可以简单地使用它的方法(假设您的数组在这里命名为“$arr”):

// 1. Sort your array in desc order
krsort($arr);

// 2. Reduce your array
$reducedArr = array_reduce($arr, function($reducedArr, $arrValues) {
    $reducedArr[$arrValues['uid']] = $arrValues; // Here we put your 'uid' as a key
    return $reducedArr;
});

// 3. Check your reduced array
print_r($reducedArr);

希望这有帮助!

【讨论】:

    【解决方案2】:

    您可以通过多种不同的方式来做到这一点。这只是一个。

    $input[]=array('id'=>'958','uid'=>'385','text'=>'2021-10-23 08:32:35');
    $input[]=array('id'=>'956','uid'=>'385','text'=>'2021-10-23 08:31:51');
    $input[]=array('id'=>'957','uid'=>'386','timestamp'=>'2021-10-23 08:32:12');
    $input[]=array('id'=>'955','uid'=>'385','timestamp'=>'2021-10-23 08:31:38');
    
    $result;
    foreach($input as $k=>$v){
        if (! isset($result[$v['uid']])){
            $result[$v['uid']] = $v;
        }
    }
    
    // if you do not care about the key
    echo '<pre>';
    var_dump($result);
    
    // if you want the keys reset
    $result = array_values($result);
    var_dump($result);
    

    结果,首先uid 成为数组键。

    array(2) {
      [385]=>
      array(3) {
        ["id"]=> string(3) "958"
        ["uid"]=> string(3) "385"
        ["text"]=> string(19) "2021-10-23 08:32:35"
      }
      [386]=>
      array(3) {
        ["id"]=> string(3) "957"
        ["uid"]=> string(3) "386"
        ["timestamp"]=> string(19) "2021-10-23 08:32:12"
      }
    }
    

    并重新设置数组键。

    array(2) {
      [0]=>
      array(3) {
        ["id"]=> string(3) "958"
        ["uid"]=> string(3) "385"
        ["text"]=> string(19) "2021-10-23 08:32:35"
      }
      [1]=>
      array(3) {
        ["id"]=> string(3) "957"
        ["uid"]=> string(3) "386"
        ["timestamp"]=> string(19) "2021-10-23 08:32:12"
      }
    }
    

    【讨论】:

      【解决方案3】:

      我猜,如果 uid 重复,你想保留数组中的第一个。

      此解决方案可能适合您

      $no_uid_duplicates = array();
      foreach( $array as $key => $item ){
          if(isset($no_uid_duplicates[$item["uid"]])){
              array_splice($array, $key, 1);
          }
          $no_uid_duplicates[$item["uid"]] = 1;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-12
        • 2021-12-31
        • 2011-08-18
        • 1970-01-01
        相关资源
        最近更新 更多