| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 | 
							- <?php
 
- // +----------------------------------------------------------------------
 
- // | ThinkPHP [ WE CAN DO IT JUST THINK ]
 
- // +----------------------------------------------------------------------
 
- // | Copyright (c) 2006~2015 http://thinkphp.cn All rights reserved.
 
- // +----------------------------------------------------------------------
 
- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
 
- // +----------------------------------------------------------------------
 
- // | Author: yunwuxin <448901948@qq.com>
 
- // +----------------------------------------------------------------------
 
- namespace think\console\output\question;
 
- use think\console\output\Question;
 
- class Choice extends Question
 
- {
 
-     private $choices;
 
-     private $multiselect  = false;
 
-     private $prompt       = ' > ';
 
-     private $errorMessage = 'Value "%s" is invalid';
 
-     /**
 
-      * 构造方法
 
-      * @param string $question 问题
 
-      * @param array  $choices  选项
 
-      * @param mixed  $default  默认答案
 
-      */
 
-     public function __construct($question, array $choices, $default = null)
 
-     {
 
-         parent::__construct($question, $default);
 
-         $this->choices = $choices;
 
-         $this->setValidator($this->getDefaultValidator());
 
-         $this->setAutocompleterValues($choices);
 
-     }
 
-     /**
 
-      * 可选项
 
-      * @return array
 
-      */
 
-     public function getChoices()
 
-     {
 
-         return $this->choices;
 
-     }
 
-     /**
 
-      * 设置可否多选
 
-      * @param bool $multiselect
 
-      * @return self
 
-      */
 
-     public function setMultiselect($multiselect)
 
-     {
 
-         $this->multiselect = $multiselect;
 
-         $this->setValidator($this->getDefaultValidator());
 
-         return $this;
 
-     }
 
-     public function isMultiselect()
 
-     {
 
-         return $this->multiselect;
 
-     }
 
-     /**
 
-      * 获取提示
 
-      * @return string
 
-      */
 
-     public function getPrompt()
 
-     {
 
-         return $this->prompt;
 
-     }
 
-     /**
 
-      * 设置提示
 
-      * @param string $prompt
 
-      * @return self
 
-      */
 
-     public function setPrompt($prompt)
 
-     {
 
-         $this->prompt = $prompt;
 
-         return $this;
 
-     }
 
-     /**
 
-      * 设置错误提示信息
 
-      * @param string $errorMessage
 
-      * @return self
 
-      */
 
-     public function setErrorMessage($errorMessage)
 
-     {
 
-         $this->errorMessage = $errorMessage;
 
-         $this->setValidator($this->getDefaultValidator());
 
-         return $this;
 
-     }
 
-     /**
 
-      * 获取默认的验证方法
 
-      * @return callable
 
-      */
 
-     private function getDefaultValidator()
 
-     {
 
-         $choices      = $this->choices;
 
-         $errorMessage = $this->errorMessage;
 
-         $multiselect  = $this->multiselect;
 
-         $isAssoc      = $this->isAssoc($choices);
 
-         return function ($selected) use ($choices, $errorMessage, $multiselect, $isAssoc) {
 
-             // Collapse all spaces.
 
-             $selectedChoices = str_replace(' ', '', $selected);
 
-             if ($multiselect) {
 
-                 // Check for a separated comma values
 
-                 if (!preg_match('/^[a-zA-Z0-9_-]+(?:,[a-zA-Z0-9_-]+)*$/', $selectedChoices, $matches)) {
 
-                     throw new \InvalidArgumentException(sprintf($errorMessage, $selected));
 
-                 }
 
-                 $selectedChoices = explode(',', $selectedChoices);
 
-             } else {
 
-                 $selectedChoices = [$selected];
 
-             }
 
-             $multiselectChoices = [];
 
-             foreach ($selectedChoices as $value) {
 
-                 $results = [];
 
-                 foreach ($choices as $key => $choice) {
 
-                     if ($choice === $value) {
 
-                         $results[] = $key;
 
-                     }
 
-                 }
 
-                 if (count($results) > 1) {
 
-                     throw new \InvalidArgumentException(sprintf('The provided answer is ambiguous. Value should be one of %s.', implode(' or ', $results)));
 
-                 }
 
-                 $result = array_search($value, $choices);
 
-                 if (!$isAssoc) {
 
-                     if (!empty($result)) {
 
-                         $result = $choices[$result];
 
-                     } elseif (isset($choices[$value])) {
 
-                         $result = $choices[$value];
 
-                     }
 
-                 } elseif (empty($result) && array_key_exists($value, $choices)) {
 
-                     $result = $value;
 
-                 }
 
-                 if (empty($result)) {
 
-                     throw new \InvalidArgumentException(sprintf($errorMessage, $value));
 
-                 }
 
-                 array_push($multiselectChoices, $result);
 
-             }
 
-             if ($multiselect) {
 
-                 return $multiselectChoices;
 
-             }
 
-             return current($multiselectChoices);
 
-         };
 
-     }
 
- }
 
 
  |