/** * 确保已经加载了配置 */ 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'); }); }
/** * 排序 * @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; }