根据元素,算出所有的组合
//组合 public function asb() { $source = array('A','B','C','D'); sort($source); //保证初始数组是有序的 $last = count($source) - 1; //$source尾部元素下标 $x = $last; $count = 1; //组合个数统计 echo implode(',', $source). "<br/>"; //输出第一种组合 while (true) { $y = $x--; //相邻的两个元素 if ($source[$x] < $source[$y]) { //如果前一个元素的值小于后一个元素的值 $z = $last; while ($source[$x] > $source[$z]) { //从尾部开始,找到第一个大于 $x 元素的值 $z--; } /* 交换 $x 和 $z 元素的值 */ list($source[$x], $source[$z]) = array($source[$z], $source[$x]); /* 将 $y 之后的元素全部逆向排列 */ for ($i = $last; $i > $y; $i--, $y++) { list($source[$i], $source[$y]) = array($source[$y], $source[$i]); } echo implode(',', $source). "<br/>"; //输出组合 $x = $last; $count++; } if ($x == 0) { //全部组合完毕 break; } } echo 'Total: ', $count, "\n"; }
/** * 随机答案 * @param $b 答案数组 * @param $source 选项 * @param $o_op 正确答案 * @param int $type 1单选2多选 * @return false|string */ public function asb($b, $source, $o_op, $type=1) { // $b = [ // 'A' => '历史成本法假定,资产价值是支付的在资产负债表日替换相同资产所需的金额。', // 'B' => '历史成本法考虑了通货膨胀对资产的影响。因此,资产价值在每期的数值是波动的。', // 'C' => '历史成本法不考虑折旧的影响。因此,资产的真实价值不能被确定。', // 'D' => '历史成本法与评估公司目前财务状况的关系不大。' // ]; // // $source = array('A', 'B', 'C', 'D'); // // $o_op = 'B,C,D'; // // $type = 2; sort($source); //保证初始数组是有序的 $last = count($source) - 1; //$source尾部元素下标 $x = $last; $count = 1; //组合个数统计 // echo implode(',', $source), " //"; //输出第一种组合 $a[] = $source; while (true) { $y = $x--; //相邻的两个元素 if ($source[$x] < $source[$y]) { //如果前一个元素的值小于后一个元素的值 $z = $last; while ($source[$x] > $source[$z]) { //从尾部开始,找到第一个大于 $x 元素的值 $z--; } /* 交换 $x 和 $z 元素的值 */ list($source[$x], $source[$z]) = array($source[$z], $source[$x]); /* 将 $y 之后的元素全部逆向排列 */ for ($i = $last; $i > $y; $i--, $y++) { list($source[$i], $source[$y]) = array($source[$y], $source[$i]); } $a[] = $source; // echo implode(',', $source), " // "; //输出组合 $x = $last; $count++; } if ($x == 0) { //全部组合完毕 break; } } $d = []; if($type == 1){ //单选题 foreach ($a as $ak => $av) { $op = []; foreach ($av as $aak => $aav) { $o1 = $aak + 1; $o = 'op' . $o1; $op[$o] = $b[$aav]; if ($aav == $o_op) { //dd($aav); $op['answer'] = str_replace([1, 2, 3, 4], ['A', 'B', 'C', 'D'], $o1); } } $d[$ak + 1] = $op; } }else{ //多选题 $o_op = explode(',',$o_op); foreach ($a as $ak => $av) { $op = []; $t_answer = []; foreach ($av as $aak => $aav) { $o1 = $aak + 1; $o = 'op' . $o1; $op[$o] = $b[$aav]; foreach ($o_op as $oov){ if ($aav == $oov) { //dd($aav); $t_answer[] = str_replace([1, 2, 3, 4], ['A', 'B', 'C', 'D'], $o1); } } } sort($t_answer); $op['answer'] = implode(',',$t_answer); $d[$ak + 1] = $op; } } return json_encode($d); }