繁体   English   中英

PHP 数组合并具有相同键的元素

[英]PHP array merge elements with same key

这不是以下问题的重复:

我需要合并 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 重复的情况下,您希望保留数组中的第一个。

此解决方案可能适合您

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

有许多不同的方法可以做到这一点。 这只是一个。

$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"
  }
}

如前所述,有很多解决方案可以解决这个问题。

我认为函数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);

希望这有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM