使用密钥的isset测试简化foreach数组构建器

时间:2013-05-23 05:44:20

标签: php arrays

对于以下数据集($data),我正在构建一个多维数组。对于每个唯一键(a),将会有一个与其关联的b值数组。

$data = [
  ['a' => 1, 'b' => 23],
  ['a' => 1, 'b' => 97],
  ['a' => 2, 'b' => 23],
  ['a' => 1, 'b' => 47],
  ['a' => 3, 'b' => 23],
];

$result = [];
foreach ($data as $d) {
  if (!isset($result[$d['a']]))
    $result[$d['a']] = [];
  $result[$d['a']][] = $d['b'];
}

print_r($result);

/*
Output should be:

[ 
  1 => [23, 97, 47],
  2 => [23],
  3 => [23],
]
*/

if (!isset($result[$d['a']])) $result[$d['a']] = [];部分很难看。有没有更性感/更有效的方法来构建这个理想的输出?

更新 谢谢大家,看起来我可以去(甚至没有初始化$result = [];

foreach ($data as $d)
  $result[$d['a']][] = $d['b'];

2 个答案:

答案 0 :(得分:2)

根本不需要检查。如果它不是数组,则会在添加第一个项目时创建它。

所以“性感”解决方案是删除if和初始化......

答案 1 :(得分:1)

不必使用isset()函数。

尝试使用此代码使其“更性感”。

$data = [

  ['a' => 1, 'b' => 23],
  ['a' => 1, 'b' => 97],
  ['a' => 2, 'b' => 23],
  ['a' => 1, 'b' => 47],
  ['a' => 3, 'b' => 23],
];

$result = [];
foreach ($data as $d) {
    $result[$d['a']][]= $d['b'];
}

print_r($result);

['a' => 1, 'b' => 23], ['a' => 1, 'b' => 97], ['a' => 2, 'b' => 23], ['a' => 1, 'b' => 47], ['a' => 3, 'b' => 23], ]; $result = []; foreach ($data as $d) { $result[$d['a']][]= $d['b']; } print_r($result);