1

次のデータセット ( $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'];
4

2 に答える 2

2

そのチェックはまったく必要ありません。配列でない場合は、最初の項目が追加されたときに作成されます。

したがって、「よりセクシーな」解決策は、ifと初期化を削除することです...

于 2013-05-23T05:48:59.833 に答える
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);

于 2013-05-23T06:01:12.363 に答える