如何从二维数组中随机取每组相同ID的一条信息?,先谢谢了!

只是喜欢 2018-05-16 08:49:52

$data = array(
array(
"eid" => "2","name" => "A1"
),
array(
"eid" => "2","name" => "A2"
),
array(
"eid" => "2","name" => "A3"
),
array(
"eid" => "8","name" => "B1"
),
array(
"eid" => "8","name" => "B2"
),
array(
"eid" => "5","name" => "C1"
),
array(
"eid" => "5","name" => "C2"
)
);


想要的结果:
$data = array(
array(
"eid" => "2","name" => "A2"
),
array(
"eid" => "8","name" => "B2"
),
array(
"eid" => "5","name" => "C1"
)
);

相同的eid随机取1条(数据多是随机取不同的多条,比如相同的eid随机取5条)

该怎么写呢,先谢谢了!
...全文
1011 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
一生小白 2018-05-17
  • 打赏
  • 举报
回复
大佬忽略了eid相同数超过两个的情况

$data = array(
    array(
        "eid" => "2","name" => "A1"
    ),
    array(
        "eid" => "2","name" => "A2"
    ),
    array(
        "eid" => "2","name" => "A3"
    ),
    array(
        "eid" => "8","name" => "B1"
    ),
    array(
        "eid" => "8","name" => "B2"
    ),
    array(
        "eid" => "5","name" => "C1"
    ),
    array(
        "eid" => "5","name" => "C2"
    )
);
foreach($data as $v) $tmp[$v['eid']][] = $v;
$res = [];
foreach($tmp as $v) {
    shuffle($v);
    $count = ceil(log(count($v)));
    if($count >1) $count = $count-1;
    $res = array_merge($res, array_slice($v, 0,$count));
}
只是喜欢 2018-05-17
  • 打赏
  • 举报
回复
改成这样已经实现了,再次感谢!

foreach($list as $v) $tmp[$v['eva_id']][] = $v;
		$res = [];
		foreach($tmp as $v) {
			shuffle($v);
			$count = ceil( 20 / count($tmp) );
			$res = array_merge($res, array_slice($v, 0, $count));
		}

只是喜欢 2018-05-17
  • 打赏
  • 举报
回复
很感谢老大啊,打了那么多字,回答好认真,真的很谢谢! 现在是这样,比如总数组有50个,是由3种不同的eid数据组成,A组eid数据有15条,B组eid数据有18条,C组eid数据有17条 现在想从50个的总数据中选择20组, 这20组数据,每种eid相同的组随机取6条,3x6=18,不够20条随机多取2条,拼够20条就好 不懂我描述是否清楚,老大能帮看下怎么改写吗?先谢谢了!
xuzuning 2018-05-17
  • 打赏
  • 举报
回复
$data = array(
            array(
                "eid" => "2","name" => "A1"
            ),
            array(
                "eid" => "2","name" => "A2"
            ),
            array(
                "eid" => "2","name" => "A3"
            ),
            array(
                "eid" => "8","name" => "B1"
            ),
            array(
                "eid" => "8","name" => "B2"
            ),
            array(
                "eid" => "5","name" => "C1"
            ),
            array(
                "eid" => "5","name" => "C2"
            )
    );
foreach($data as $v) $tmp[$v['eid']][] = $v;
$res = [];
foreach($tmp as $v) {
  shuffle($v);
  $res = array_merge($res, array_slice($v, 0,ceil(log(count($v)))));
}
print_r($res);
xuzuning 2018-05-17
  • 打赏
  • 举报
回复
你要求的是: 相同的eid随机取1条 只需将 $res = array_merge($res, array_slice($v, 0,ceil(log(count($v))))); 改为 $res[] = $v[0]; 即可 数据多时随机取不同的多条,比如相同的eid随机取5条 如何判断 数据多,你并没有说,我只是给出了一种可能性,和组装的方法而已 $res = array_merge($res, array_slice($v, 0,ceil(log(count($v))))); 想来并不伤大雅 shuffle 只是打乱数组,并不会对数组原有的值产生影响 如果说是 选出来的有重复,那么只能说明你的数组本来就是有重复的
只是喜欢 2018-05-17
  • 打赏
  • 举报
回复
而且选出来的有重复
只是喜欢 2018-05-17
  • 打赏
  • 举报
回复
首先很感谢两位大神,我试了下,发现点小问题,我数组有50个,但是最终只输出了8个,不懂是哪里的原因?

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧