按一列对二维数组进行分组,并使用另一列在每组内形成子数组

问题描述 投票:0回答:2

我有一个如下所示的数组:

$myArray = 
[
  ['email' => '[email protected]', 'value' => '123'],
  ['email' => '[email protected]', 'value' => '456'],
  ['email' => '[email protected]', 'value' => '789'],
  ['email' => '[email protected]', 'value' => '123'],
  ['email' => '[email protected]', 'value' => '456'],
  ...
]

根据唯一列值(电子邮件)组合值的好方法是什么,以使之前的数组最终像这样:

[
  '[email protected]' => ['123', '456'],
  '[email protected]' => ['123', '456', '789'],
  ...
]

我可以想到解决方案,但它们看起来效率都很低:(以下是一个例子:

$resultArray = array();
foreach ($myArray as $info) {
    if (!isset($resultArray[$info['email']])) {
        $resultArray[$info['email']] = array();
    }
    array_push($resultArray[$info['email']], $info['value']);
}

出于某种原因,这不适合我。

问题

有更好的解决方案吗?

-- 更新了我的明显错误 - 检查新的(第一个)数组:/ --

php arrays multidimensional-array grouping sub-array
2个回答
2
投票

您对

array_push()
的所有检查和使用都可以用 空数组索引器 代替。这极大地简化了您的循环,如下所示:

foreach ($myArray as $item) {
    $result[$item['email']][] = $item['value'];
}

这里就是一个例子。


1
投票

您可以简单地使用

foreach
作为

$myArray = 
[
  ['email' => '[email protected]', 'value' => '123'],
  ['email' => '[email protected]', 'value' => '456'],
  ['email' => '[email protected]', 'value' => '789'],
  ['email' => '[email protected]', 'value' => '123'],
  ['email' => '[email protected]', 'value' => '456'],
];
$result = array();
foreach ($myArray as $key => &$value) {
  if(isset($result[$value['email']])){
      array_push($result[$value['email']],$value['value']);
  }else{
      $result[$value['email']] = array($value['value']);
  }
}

演示

© www.soinside.com 2019 - 2024. All rights reserved.