//组合
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);
}