根据元素,算出所有的组合

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

  

posted @ 2023-02-06 10:24  叫我亚庆  阅读(41)  评论(0)    收藏  举报