You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							139 lines
						
					
					
						
							3.7 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							139 lines
						
					
					
						
							3.7 KiB
						
					
					
				| <?php | |
| 
 | |
| /* | |
|  | |
| 	Copyright (c) 2009-2019 F3::Factory/Bong Cosca, All rights reserved. | |
|  | |
| 	This file is part of the Fat-Free Framework (http://fatfreeframework.com). | |
|  | |
| 	This is free software: you can redistribute it and/or modify it under the | |
| 	terms of the GNU General Public License as published by the Free Software | |
| 	Foundation, either version 3 of the License, or later. | |
|  | |
| 	Fat-Free Framework is distributed in the hope that it will be useful, | |
| 	but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | |
| 	General Public License for more details. | |
|  | |
| 	You should have received a copy of the GNU General Public License along | |
| 	with Fat-Free Framework.  If not, see <http://www.gnu.org/licenses/>. | |
|  | |
| */ | |
| 
 | |
| //! Generic array utilities | |
| class Matrix extends Prefab { | |
| 
 | |
| 	/** | |
| 	*	Retrieve values from a specified column of a multi-dimensional | |
| 	*	array variable | |
| 	*	@return array | |
| 	*	@param $var array | |
| 	*	@param $col mixed | |
| 	**/ | |
| 	function pick(array $var,$col) { | |
| 		return array_map( | |
| 			function($row) use($col) { | |
| 				return $row[$col]; | |
| 			}, | |
| 			$var | |
| 		); | |
| 	} | |
| 
 | |
| 	/** | |
| 	 * select a subset of fields from an input array | |
| 	 * @param string|array $fields splittable string or array | |
| 	 * @param string|array $data hive key or array | |
| 	 * @return array | |
| 	 */ | |
| 	function select($fields, $data) { | |
| 		return array_intersect_key(is_array($data) ? $data : \Base::instance()->get($data), | |
| 			array_flip(is_array($fields) ? $fields : \Base::instance()->split($fields))); | |
| 	} | |
| 
 | |
| 	/** | |
| 	 * walk with a callback function through a subset of fields from an input array | |
| 	 * the callback receives the value, index-key and the full input array as parameters | |
| 	 * set value parameter as reference and you're able to modify the data as well | |
| 	 * @param string|array $fields splittable string or array of fields | |
| 	 * @param string|array $data hive key or input array | |
| 	 * @param callable $callback (mixed &$value, string $key, array $data) | |
| 	 * @return array modified subset data | |
| 	 */ | |
| 	function walk($fields, $data, $callback) { | |
| 		$subset=$this->select($fields, $data); | |
| 		array_walk($subset, $callback, $data); | |
| 		return $subset; | |
| 	} | |
| 
 | |
| 	/** | |
| 	*	Rotate a two-dimensional array variable | |
| 	*	@return NULL | |
| 	*	@param $var array | |
| 	**/ | |
| 	function transpose(array &$var) { | |
| 		$out=[]; | |
| 		foreach ($var as $keyx=>$cols) | |
| 			foreach ($cols as $keyy=>$valy) | |
| 				$out[$keyy][$keyx]=$valy; | |
| 		$var=$out; | |
| 	} | |
| 
 | |
| 	/** | |
| 	*	Sort a multi-dimensional array variable on a specified column | |
| 	*	@return bool | |
| 	*	@param $var array | |
| 	*	@param $col mixed | |
| 	*	@param $order int | |
| 	**/ | |
| 	function sort(array &$var,$col,$order=SORT_ASC) { | |
| 		uasort( | |
| 			$var, | |
| 			function($val1,$val2) use($col,$order) { | |
| 				list($v1,$v2)=[$val1[$col],$val2[$col]]; | |
| 				$out=is_numeric($v1) && is_numeric($v2)? | |
| 					Base::instance()->sign($v1-$v2):strcmp($v1,$v2); | |
| 				if ($order==SORT_DESC) | |
| 					$out=-$out; | |
| 				return $out; | |
| 			} | |
| 		); | |
| 		$var=array_values($var); | |
| 	} | |
| 
 | |
| 	/** | |
| 	*	Change the key of a two-dimensional array element | |
| 	*	@return NULL | |
| 	*	@param $var array | |
| 	*	@param $old string | |
| 	*	@param $new string | |
| 	**/ | |
| 	function changekey(array &$var,$old,$new) { | |
| 		$keys=array_keys($var); | |
| 		$vals=array_values($var); | |
| 		$keys[array_search($old,$keys)]=$new; | |
| 		$var=array_combine($keys,$vals); | |
| 	} | |
| 
 | |
| 	/** | |
| 	*	Return month calendar of specified date, with optional setting for | |
| 	*	first day of week (0 for Sunday) | |
| 	*	@return array | |
| 	*	@param $date string|int | |
| 	*	@param $first int | |
| 	**/ | |
| 	function calendar($date='now',$first=0) { | |
| 		$out=FALSE; | |
| 		if (extension_loaded('calendar')) { | |
| 			if (is_string($date)) | |
| 				$date=strtotime($date); | |
| 			$parts=getdate($date); | |
| 			$days=cal_days_in_month(CAL_GREGORIAN,$parts['mon'],$parts['year']); | |
| 			$ref=date('w',strtotime(date('Y-m',$parts[0]).'-01'))+(7-$first)%7; | |
| 			$out=[]; | |
| 			for ($i=0;$i<$days;$i++) | |
| 				$out[floor(($ref+$i)/7)][($ref+$i)%7]=$i+1; | |
| 		} | |
| 		return $out; | |
| 	} | |
| 
 | |
| }
 | |
| 
 |