|  |  | @ -149,15 +149,24 @@ class ArrayHelper | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * ~~~ |  |  |  | 	 * ~~~ | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * |  |  |  | 	 * | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @param array $array |  |  |  | 	 * @param array $array | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @param string|\Closure $key |  |  |  | 	 * @param string|\Closure $name | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	 * @param boolean $keepKeys whether to maintain the array keys. If false, the resulting array | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	 * will be re-indexed with integers. | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @return array the list of column values |  |  |  | 	 * @return array the list of column values | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 */ |  |  |  | 	 */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 	public static function getColumn($array, $key) |  |  |  | 	public static function getColumn($array, $name, $keepKeys = true) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  | 	{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 		$result = array(); |  |  |  | 		$result = array(); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		foreach ($array as $element) { |  |  |  | 		if ($keepKeys) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			$result[] = static::getValue($element, $key); |  |  |  | 			foreach ($array as $k => $element) { | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				$result[$k] = static::getValue($element, $name); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		} else { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			foreach ($array as $element) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				$result[] = static::getValue($element, $name); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return $result; |  |  |  | 		return $result; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -218,37 +227,56 @@ class ArrayHelper | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	/** |  |  |  | 	/** | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * Sorts a multi-dimensional array by a specific key. |  |  |  | 	 * Sorts an array of objects or arrays (with the same structure) by one or several keys. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * The multi-dimensional array can be either an array of arrays or an array of objects, |  |  |  | 	 * @param array $array the array to be sorted. The array will be modified after calling this method. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * and the key can be a key name of the sub-arrays or a property name of the objects. |  |  |  | 	 * @param string|\Closure|array $key the key(s) to be sorted by. This refers to a key name of the sub-array | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @param array $items the multi-dimensional array to be sorted |  |  |  | 	 * elements, a property name of the objects, or an anonymous function returning the values for comparison | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @param string|\Closure $key key name of the array element, or property name of the object, |  |  |  | 	 * purpose. The anonymous function signature should be: `function($item)`. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * or an anonymous function returning the value. The anonymous function signature should be: |  |  |  | 	 * To sort by multiple keys, provide an array of keys here. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * `function($item)`. |  |  |  | 	 * @param boolean|array $ascending whether to sort in ascending or descending order. When | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @param boolean $ascending whether to sort in ascending or descending order |  |  |  | 	 * sorting by multiple keys with different ascending orders, use an array of ascending flags. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @param integer $sortFlag the PHP sort flag (e.g. `SORT_REGULAR`, `SORT_NUMERIC`.) |  |  |  | 	 * @param integer|array $sortFlag the PHP sort flag. Valid values include: | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	 * `SORT_REGULAR`, `SORT_NUMERIC`, `SORT_STRING`, and `SORT_STRING | SORT_FLAG_CASE`. The last | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	 * value is for sorting strings in case-insensitive manner. Please refer to | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * See [PHP manual](http://php.net/manual/en/function.sort.php) for more details. |  |  |  | 	 * See [PHP manual](http://php.net/manual/en/function.sort.php) for more details. | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 * @return array the sorted result. Note that the array will be re-indexed with integers. |  |  |  | 	 * When sorting by multiple keys with different sort flags, use an array of sort flags. | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	 * @throws \yii\base\BadParamException if the $ascending or $sortFlag parameters do not have | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	 * correct number of elements as that of $key. | 
			
		
	
		
		
			
				
					
					|  |  |  | 	 */ |  |  |  | 	 */ | 
			
		
	
		
		
			
				
					
					|  |  |  | 	public static function sort($items, $key, $ascending = true, $sortFlag = SORT_REGULAR) |  |  |  | 	public static function sort(&$array, $key, $ascending = true, $sortFlag = SORT_REGULAR) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	{ |  |  |  | 	{ | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (empty($items)) { |  |  |  | 		$keys = is_array($key) ? $key : array($key); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			return $items; |  |  |  | 		if (empty($keys) || empty($array)) { | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			return; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 		$n = count($keys); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		foreach ($items as $k => $item) { |  |  |  | 		if (is_scalar($ascending)) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			$index[$k] = static::getValue($item, $key); |  |  |  | 			$ascending = array_fill(0, $n, $ascending); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		} elseif (count($ascending) !== $n) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			throw new \yii\base\BadParamException('The length of $ascending parameter must be the same as that of $keys.'); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if ($ascending) { |  |  |  | 		if (is_scalar($sortFlag)) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			asort($index, $sortFlag); |  |  |  | 			$sortFlag = array_fill(0, $n, $sortFlag); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		} else { |  |  |  | 		} elseif (count($sortFlag) !== $n) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			arsort($index, $sortFlag); |  |  |  | 			throw new \yii\base\BadParamException('The length of $ascending parameter must be the same as that of $keys.'); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 		$args = array(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		$result = array(); |  |  |  | 		foreach ($keys as $i => $key) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		foreach ($index as $k => $v) { |  |  |  | 			$flag = $sortFlag[$i]; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 			$result[] = $items[$k]; |  |  |  | 			if ($flag == (SORT_STRING | SORT_FLAG_CASE)) { | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				$flag = SORT_STRING; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				$column = array(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				foreach (static::getColumn($array, $key) as $k => $value) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 					$column[$k] = strtolower($value); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				$args[] = $column; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			} else { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 				$args[] = static::getColumn($array, $key); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			$args[] = $ascending[$i]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			$args[] = $flag; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return $result; |  |  |  | 		$args[] &= $array; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		call_user_func_array('array_multisort', $args); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } |