根据类似键的数组值 - PHP

时间:2015-06-09 12:24:51

标签: php arrays

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

$myArray = 
[
  ['email' => 'email1@email.com', 'value' => '123'],
  ['email' => 'email1@email.com', 'value' => '456'],
  ['email' => 'email1@email.com', 'value' => '789'],
  ['email' => 'email2@email2.com', 'value' => '123'],
  ['email' => 'email2@email2.com', 'value' => '456'],
  ...
]

根据唯一键(电子邮件)组合值的好方法是什么,这样前一个数组最终会像这样结束:

[
  'email@email.com' => ['123', '456'],
  'email2@email2.com' => ['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']);
}

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

问题

有更好的解决方案吗?

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

2 个答案:

答案 0 :(得分:2)

array_push()的所有检查和使用均可由empty array indexer替换。这大大简化了循环,如下所示:

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

这方面的一个例子是here

答案 1 :(得分:1)

您只需使用foreach作为

即可
$myArray = 
[
  ['email' => 'email1@email.com', 'value' => '123'],
  ['email' => 'email1@email.com', 'value' => '456'],
  ['email' => 'email1@email.com', 'value' => '789'],
  ['email' => 'email2@email2.com', 'value' => '123'],
  ['email' => 'email2@email2.com', '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']);
  }
}

DEMO