Example #1
0
 /**
  * 确保已经加载了配置
  */
 public function ensureLoaded()
 {
     Lazy::init($this->_items, function () {
         /** @var CDbConnection $db */
         $db = Yii::app()->db;
         $items = $db->createCommand()->select(array('key', 'value'))->from('t_config')->queryAll();
         return Matrix::from($items)->indexedBy('key')->column('value');
     });
 }
Example #2
0
 /**
  * 排序
  * @param $keyNames mixed
  * 1. string 根据单个key进行排序
  * 2. array 指定多个key进行排序,形如 array('id', 'name') 或
  *      array(
  *            // 排序类型或排序标志:
  *           'id' => array( SORT_ASC/SORT_DESC, SORT_REGULAR/SORT_NUMERIC/SORT_STRING),
  *           'name' => array(SORT_ASC),
  *           'age' => SORT_NUMERIC,
  *           // 按照某个列表进行排序,"list:"是前导标志;
  *           // 不在列表中的值排在最后
  *           'gender' => array('list:', 'male', 'female)
  *      )
  * @param $orderType int SORT_ASC/SORT_DESC
  * @param $sortFlag int SORT_REGULAR/SORT_NUMERIC/SORT_STRING
  * @return Matrix
  * @throws InvalidArgumentException
  */
 public function orderBy($keyNames, $orderType = SORT_ASC, $sortFlag = SORT_REGULAR)
 {
     // 先转化为数组
     $this->data = $this->toArray();
     // 多个key进行排序
     if (is_array($keyNames)) {
         // 构造array_multisort的参数
         $args = array();
         foreach ($keyNames as $key => $option) {
             // 数字key,说明$option其实是列名
             if (is_int($key)) {
                 $args[] = Matrix::from($this->data)->column($option);
                 $args[] = $orderType;
                 $args[] = $sortFlag;
             } else {
                 if ($option[0] === 'list:') {
                     // 按照列表进行排序
                     array_shift($option);
                     $args[] = $this->duplicate()->map(function ($row) use($key, $option) {
                         $index = array_search($row[$key], $option);
                         return $index === false ? PHP_INT_MAX : $index;
                     })->toArray();
                     $args[] = $orderType;
                     $args[] = $sortFlag;
                 } else {
                     $args[] = Matrix::from($this->data)->column($key);
                     // 只有一个元素,简化处理
                     if (is_array($option) && count($option) == 1) {
                         $option = reset($option);
                     }
                     // 增加排序类型和排序标志参数
                     if (is_array($option)) {
                         $args[] = $option[0];
                         $args[] = $option[1];
                     } else {
                         if (in_array($option, array(SORT_ASC, SORT_DESC))) {
                             $args[] = $option;
                             $args[] = $sortFlag;
                         } else {
                             $args[] = $orderType;
                             $args[] = $sortFlag;
                         }
                     }
                 }
             }
         }
         //            $args[] = &$this->data;
         //            call_user_func_array('array_multisort', $args);   // call_user_func_array seems won't change data! (It's a bug under PHP3.3.3. However, I have to work with it!)
         switch (count($keyNames)) {
             case 1:
                 array_multisort($args[0], $args[1], $args[2], $this->data);
                 break;
             case 2:
                 array_multisort($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $this->data);
                 break;
             case 3:
                 array_multisort($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7], $args[8], $this->data);
                 break;
             default:
                 throw new InvalidArgumentException('Too many sort keys!');
         }
     } else {
         $sortColumnData = Matrix::from($this->data)->column($keyNames);
         array_multisort($sortColumnData, $orderType, $sortFlag, $this->data);
     }
     return $this;
 }