【问题标题】:Shuffle an array in php does not really shuffle array [duplicate]在php中随机播放数组并没有真正随机播放数组[重复]
【发布时间】:2016-07-16 20:31:38
【问题描述】:

我正在从我的数据库中获取结果到 JSON 数组中。我想随机化这个数组,因为现在它进入类别 1、2、3、4 并且总是在同一行中获取数据。我怎样才能将它随机化,以便它从类别 4、2、1、3 中获取数据(不一定按此顺序)。我的代码:

$query = $handler->query('SELECT DISTINCT c.cat_description, c.cat_name, c.cat_id, q.question, q.q_id FROM `categories` c
                                        INNER JOIN `questions` q ON c.cat_id = q.cat_id ');
$records = array();
$records = $query->fetchAll(PDO::FETCH_ASSOC);
$first = array();
$second = array();
$third = array();
$query->closeCursor();
foreach($records as $k => $v){
    $first[] = array("category_name" => $v['cat_name'], "category_id" => $v['cat_id'], "category_description" => $v['cat_description'], "question_name" => $v['question'], "question_id" => $v['q_id'],  "question_answers" => array());
    $second[] = $v['question'];
}

foreach ($second as $key => $value) {
    $ques = $value;
    $qu = $handler->query("SELECT a.quest_id, a.answer, a.iscorrect, a.anser_id FROM `answers` a INNER JOIN `questions` q ON a.quest_id = q.q_id WHERE q.question = '$ques' ");
    $third = $qu->fetchAll(PDO::FETCH_ASSOC);
    foreach($third as $tk => $tv){
        $third[$tk]['answer'.($tk+1)] = $tv['answer'];
        $third[$tk]['iscorrect'.($tk+1)] = $tv['iscorrect'];
    }
    foreach ($first as $k => $v) {
        $first[$key]['question_answers'] = $third;
    }
}
function shuffle_assoc($list) { 
  if (!is_array($list)) return $list; 

  $keys = array_keys($list); 
  shuffle($keys); 
  $random = array(); 
  foreach ($keys as $key) { 
    $random[$key] = $list[$key]; 
  }
  return $random; 
}

$first = shuffle($first);

$j['quiz'] = $first;

echo json_encode($j);

我试过 shuffle 但它只返回 true。我试过 array_rand 但它返回了密钥。我该怎么做?

【问题讨论】:

  • Function shuffle_assoc 你的代码对我来说似乎完全正确:如果你需要保留值和键之间的关联,它应该为你完成这项工作。
  • 如果你能在这里添加输入数组就更好了,我们会弄清楚你的数组中有什么样的索引..
  • 我认为这个问题是关于来自shuffle 的“缺乏随机性”,所以我提到从 PHP 7.1 开始,内部随机化算法已更改为使用 @ 987654322@ 而不是 libc rand 函数。 (如果其他人也被这个问题“误导”,我还不如提一下!)

标签: php arrays random


【解决方案1】:

shuffle() 更改数组,而不是返回具有不同元素顺序的新数组。所以你需要做的就是:

shuffle($first);

代替:

$first = shuffle($first);

【讨论】:

  • 我真傻...谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多