dポイントプレゼントキャンペーン実施中!

PHP多次元配列で特定キーが重複している箇所をランダムで1つだけ表示したい
・id基準

■元配列
Array
(
  [0] => Array
    (
      [id] => 5
      [name] => "佐藤"
      [age] => 5
    )
  [1] => Array
    (
      [id] => 5
      [name] => "伊藤"
      [age] => 7
    )

  [2] => Array
    (
      [id] => 5
      [name] => "鈴木"
      [age] => 12
    )

  [3] => Array
    (
      [id] => 8
      [name] => "山田"
      [age] => 17
    )

  [4] => Array
    (
      [id] => 8
      [name] => "奈良"
      [age] => 2
    )


■取得したいランダム結果配列例1
Array
(
  [0] => Array
    (
      [id] => 5
      [name] => "佐藤"
      [age] => 5
    )
  [3] => Array
    (
      [id] => 8
      [name] => "山田"
      [age] => 17
    )

■取得したいランダム結果配列例2
Array
(
  [1] => Array
    (
      [id] => 5
      [name] => "伊藤"
      [age] => 7
    )
  [4] => Array
    (
      [id] => 8
      [name] => "奈良"
      [age] => 2
    )
※1次元目のキーは元キーを維持していなくても構いません

A 回答 (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'));
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/10/23 08:17

ちなみに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)
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/10/23 08:22

<?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'));
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/10/23 08:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!