- ベストアンサー
PHP多次元配列で特定キーが重複している箇所をランダムで表示したい
- PHP多次元配列の特定のキーが重複している箇所をランダムに1つだけ表示する方法を教えてください。
- 元の配列には[id]、[name]、[age]というキーがありますが、重複している[id]の値を持つ要素の中からランダムに1つだけ表示したいです。
- 取得したいランダム結果の配列は、元の配列の一部をランダムに取り出して新しい配列を作成するイメージです。1次元目のキーは元の配列と同じではなくても構いません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
function array_rand_each_group(array $arrays,$column){ $res = []; shuffle($arrays); foreach($arrays as $array){ $res[$array[$column]] = $array; } return $res; } $arrays = [ ['id' => 5, 'name' => '佐藤', 'age' => 5], ['id' => 5, 'name' => '伊藤', 'age' => 7], ['id' => 5, 'name' => '鈴木', 'age' => 12], ['id' => 8, 'name' => '山田', 'age' => 17], ['id' => 8, 'name' => '奈良', 'age' => 2], ]; print_r(array_rand_each_group($arrays,'id'));
その他の回答 (2)
ちなみにRubyだとめっちゃ綺麗に書けますw (何だかんだPHP好きなんですけどどうしてもRubyには美しさで負けてしまいますね) def array_rand_each_group(array_of_hash, column) array_of_hash.group_by { |x| x[column] }.values.map(&:sample) end array_of_hash = [ {:id => 5, :name => '佐藤', :age => 5}, {:id => 5, :name => '伊藤', :age => 7}, {:id => 5, :name => '鈴木', :age => 12}, {:id => 8, :name => '山田', :age => 17}, {:id => 8, :name => '奈良', :age => 2}, ]; p array_rand_each_group(array_of_hash, :id)
お礼
回答ありがとうございました。 ・Rubyだとこんなにスッキリ書けるんですね ・PHP書けるようになったら学習してみたいと思います ・参考になりましたー
<?php function array_rand_each_group(array $arrays, $column) { $groups = []; foreach ($arrays as $array) { $groups[$array[$column]][] = $array; } return array_values(array_map( function ($group) { return $group[array_rand($group)]; }, $groups )); } $arrays = [ ['id' => 5, 'name' => '佐藤', 'age' => 5], ['id' => 5, 'name' => '伊藤', 'age' => 7], ['id' => 5, 'name' => '鈴木', 'age' => 12], ['id' => 8, 'name' => '山田', 'age' => 17], ['id' => 8, 'name' => '奈良', 'age' => 2], ]; print_r(array_rand_each_group($arrays, 'id'));
お礼
回答ありがとうございました。 期待通りに動作しました。 参考になりましたー
お礼
回答ありがとうございました。 shuffle関数とかあるんですね。 大変参考になりましたー