$json = <<<EOT
[
{"album":"album1","truck":"truck1"},
{"album":"album1","truck":"truck3"},
{"album":"album1","truck":"truck4"},
{"album":"album1","truck":"truck6"},
{"album":"album2","truck":"truck2"},
{"album":"album2","truck":"truck3"},
{"album":"album3","truck":"truck2"},
{"album":"album3","truck":"truck5"}
{"album":"album4","truck":"truck5"},
{"album":"album4","truck":"truck6"},
{"album":"album5","truck":"truck1"},
{"album":"album5","truck":"truck3"},
{"album":"album6","truck":"truck2"},
{"album":"album6","truck":"truck3"},
{"album":"album6","truck":"truck4"},
{"album":"album7","truck":"truck2"},
{"album":"album7","truck":"truck5"},
{"album":"album7","truck":"truck6"}
]
EOT;
$data = json_decode($json);
foreach($data as $row){
   //echo '唱片:'.$row->album.' ,曲目:'.$row->truck.'<br />';
}
有一个json格式的数组。储存唱片专辑及曲目。
如何随机取出4个唱片,每个唱片取出一首曲目,且这4首曲目名不重复?(album为唱片,truck为曲目。)

解决方案 »

  1.   

    $json = <<<EOT
    [
    {"album":"album1","truck":"truck1"},
    {"album":"album1","truck":"truck3"},
    {"album":"album1","truck":"truck4"},
    {"album":"album1","truck":"truck6"},
    {"album":"album2","truck":"truck2"},
    {"album":"album2","truck":"truck3"},
    {"album":"album3","truck":"truck2"},
    {"album":"album3","truck":"truck5"}, //少了个逗号!!
    {"album":"album4","truck":"truck5"},
    {"album":"album4","truck":"truck6"},
    {"album":"album5","truck":"truck1"},
    {"album":"album5","truck":"truck3"},
    {"album":"album6","truck":"truck2"},
    {"album":"album6","truck":"truck3"},
    {"album":"album6","truck":"truck4"},
    {"album":"album7","truck":"truck2"},
    {"album":"album7","truck":"truck5"},
    {"album":"album7","truck":"truck6"}
    ]
    EOT;
    $data = json_decode($json);$ar = array_rand($data, 4);
    foreach($ar as $k) {
    echo '唱片:'.$data[$k]->album.' ,曲目:'.$data[$k]->truck.'<br />';
    }
      

  2.   

    利用array_rand()随机取元素(具体说明自己看手册)。
    或者也可以用shuffle()函数打乱$data数组,然后取前4或尾4个元素。
      

  3.   

    这样的话,会取到:
    唱片:album1 ,曲目:truck6
    唱片:album3 ,曲目:truck2
    唱片:album4 ,曲目:truck6
    唱片:album6 ,曲目:truck3
    注意:很明显单纯使用array_rand(),会出现上述情况,2次truck6。
    而我需要所有的truck不重复。如何进一步检索?谢谢。
      

  4.   

    array_rand 会出现重复项,shuffle 不会
    $data = json_decode($json);shuffle($data);
    foreach(array_slice($data, -4) as $v)
        echo '唱片:'.$v->album.' ,曲目:'.$v->truck.'<br />';
      

  5.   

    shuffle($data);
    $obj_lastItem = array('album' => '', 'truck' => '');$counter = 0;while($counter < 4) {
    while ($data[0]->album == $obj_lastItem['album'] && $data[0]->truck == $obj_lastItem['truck']) shuffle($data);
    $obj_lastItem['album'] = $data[0]->album;
    $obj_lastItem['truck'] = $data[0]->truck;
    echo "唱片:{$obj_lastItem['album']}, 曲目:{$obj_lastItem['truck']}<br />";
    $counter ++;
    }
      

  6.   

    我说错了,不是 array_rand 会出现重复项
    而是他原始的数据有重复,需要做去重处理
    $data = json_decode($json);
    foreach($data as $v) $r[$v->truck] = $v;
    $data = $r;
    $ar = array_rand($data, 4);
    foreach($ar as $k) {
        echo '唱片:'.$data[$k]->album.' ,曲目:'.$data[$k]->truck.'<br />';
    }