• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:多次元配列で特定キーが重複している箇所をランダムで)

PHP多次元配列で特定キーが重複している箇所をランダムで表示したい

このQ&Aのポイント
  • PHP多次元配列の特定のキーが重複している箇所をランダムに1つだけ表示する方法を教えてください。
  • 元の配列には[id]、[name]、[age]というキーがありますが、重複している[id]の値を持つ要素の中からランダムに1つだけ表示したいです。
  • 取得したいランダム結果の配列は、元の配列の一部をランダムに取り出して新しい配列を作成するイメージです。1次元目のキーは元の配列と同じではなくても構いません。

質問者が選んだベストアンサー

  • ベストアンサー
  • wave117
  • ベストアンサー率100% (5/5)
回答No.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'));

re97
質問者

お礼

回答ありがとうございました。 shuffle関数とかあるんですね。 大変参考になりましたー

その他の回答 (2)

noname#244856
noname#244856
回答No.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)

re97
質問者

お礼

回答ありがとうございました。 ・Rubyだとこんなにスッキリ書けるんですね ・PHP書けるようになったら学習してみたいと思います ・参考になりましたー

noname#244856
noname#244856
回答No.1

<?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'));

re97
質問者

お礼

回答ありがとうございました。 期待通りに動作しました。 参考になりましたー

関連するQ&A