726 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			726 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * PHPExcel
 | |
|  *
 | |
|  * Copyright (c) 2006 - 2014 PHPExcel
 | |
|  *
 | |
|  * This library is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU Lesser General Public
 | |
|  * License as published by the Free Software Foundation; either
 | |
|  * version 2.1 of the License, or (at your option) any later version.
 | |
|  *
 | |
|  * This library 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
 | |
|  * Lesser General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Lesser General Public
 | |
|  * License along with this library; if not, write to the Free Software
 | |
|  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | |
|  *
 | |
|  * @category	PHPExcel
 | |
|  * @package		PHPExcel_Calculation
 | |
|  * @copyright	Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
 | |
|  * @license		http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
 | |
|  * @version		##VERSION##, ##DATE##
 | |
|  */
 | |
| 
 | |
| 
 | |
| /** PHPExcel root directory */
 | |
| if (!defined('PHPEXCEL_ROOT')) {
 | |
| 	/**
 | |
| 	 * @ignore
 | |
| 	 */
 | |
| 	define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');
 | |
| 	require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
 | |
| }
 | |
| 
 | |
| 
 | |
| /** MAX_VALUE */
 | |
| define('MAX_VALUE', 1.2e308);
 | |
| 
 | |
| /** 2 / PI */
 | |
| define('M_2DIVPI', 0.63661977236758134307553505349006);
 | |
| 
 | |
| /** MAX_ITERATIONS */
 | |
| define('MAX_ITERATIONS', 256);
 | |
| 
 | |
| /** PRECISION */
 | |
| define('PRECISION', 8.88E-016);
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * PHPExcel_Calculation_Functions
 | |
|  *
 | |
|  * @category	PHPExcel
 | |
|  * @package		PHPExcel_Calculation
 | |
|  * @copyright	Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
 | |
|  */
 | |
| class PHPExcel_Calculation_Functions {
 | |
| 
 | |
| 	/** constants */
 | |
| 	const COMPATIBILITY_EXCEL		= 'Excel';
 | |
| 	const COMPATIBILITY_GNUMERIC	= 'Gnumeric';
 | |
| 	const COMPATIBILITY_OPENOFFICE	= 'OpenOfficeCalc';
 | |
| 
 | |
| 	const RETURNDATE_PHP_NUMERIC	= 'P';
 | |
| 	const RETURNDATE_PHP_OBJECT		= 'O';
 | |
| 	const RETURNDATE_EXCEL			= 'E';
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Compatibility mode to use for error checking and responses
 | |
| 	 *
 | |
| 	 * @access	private
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	protected static $compatibilityMode	= self::COMPATIBILITY_EXCEL;
 | |
| 
 | |
| 	/**
 | |
| 	 * Data Type to use when returning date values
 | |
| 	 *
 | |
| 	 * @access	private
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	protected static $ReturnDateType	= self::RETURNDATE_EXCEL;
 | |
| 
 | |
| 	/**
 | |
| 	 * List of error codes
 | |
| 	 *
 | |
| 	 * @access	private
 | |
| 	 * @var array
 | |
| 	 */
 | |
| 	protected static $_errorCodes	= array( 'null'				=> '#NULL!',
 | |
| 											 'divisionbyzero'	=> '#DIV/0!',
 | |
| 											 'value'			=> '#VALUE!',
 | |
| 											 'reference'		=> '#REF!',
 | |
| 											 'name'				=> '#NAME?',
 | |
| 											 'num'				=> '#NUM!',
 | |
| 											 'na'				=> '#N/A',
 | |
| 											 'gettingdata'		=> '#GETTING_DATA'
 | |
| 										   );
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Set the Compatibility Mode
 | |
| 	 *
 | |
| 	 * @access	public
 | |
| 	 * @category Function Configuration
 | |
| 	 * @param	 string		$compatibilityMode		Compatibility Mode
 | |
| 	 *												Permitted values are:
 | |
| 	 *													PHPExcel_Calculation_Functions::COMPATIBILITY_EXCEL			'Excel'
 | |
| 	 *													PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC		'Gnumeric'
 | |
| 	 *													PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE	'OpenOfficeCalc'
 | |
| 	 * @return	 boolean	(Success or Failure)
 | |
| 	 */
 | |
| 	public static function setCompatibilityMode($compatibilityMode) {
 | |
| 		if (($compatibilityMode == self::COMPATIBILITY_EXCEL) ||
 | |
| 			($compatibilityMode == self::COMPATIBILITY_GNUMERIC) ||
 | |
| 			($compatibilityMode == self::COMPATIBILITY_OPENOFFICE)) {
 | |
| 			self::$compatibilityMode = $compatibilityMode;
 | |
| 			return True;
 | |
| 		}
 | |
| 		return False;
 | |
| 	}	//	function setCompatibilityMode()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Return the current Compatibility Mode
 | |
| 	 *
 | |
| 	 * @access	public
 | |
| 	 * @category Function Configuration
 | |
| 	 * @return	 string		Compatibility Mode
 | |
| 	 *							Possible Return values are:
 | |
| 	 *								PHPExcel_Calculation_Functions::COMPATIBILITY_EXCEL			'Excel'
 | |
| 	 *								PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC		'Gnumeric'
 | |
| 	 *								PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE	'OpenOfficeCalc'
 | |
| 	 */
 | |
| 	public static function getCompatibilityMode() {
 | |
| 		return self::$compatibilityMode;
 | |
| 	}	//	function getCompatibilityMode()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Set the Return Date Format used by functions that return a date/time (Excel, PHP Serialized Numeric or PHP Object)
 | |
| 	 *
 | |
| 	 * @access	public
 | |
| 	 * @category Function Configuration
 | |
| 	 * @param	 string	$returnDateType			Return Date Format
 | |
| 	 *												Permitted values are:
 | |
| 	 *													PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC		'P'
 | |
| 	 *													PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT		'O'
 | |
| 	 *													PHPExcel_Calculation_Functions::RETURNDATE_EXCEL			'E'
 | |
| 	 * @return	 boolean							Success or failure
 | |
| 	 */
 | |
| 	public static function setReturnDateType($returnDateType) {
 | |
| 		if (($returnDateType == self::RETURNDATE_PHP_NUMERIC) ||
 | |
| 			($returnDateType == self::RETURNDATE_PHP_OBJECT) ||
 | |
| 			($returnDateType == self::RETURNDATE_EXCEL)) {
 | |
| 			self::$ReturnDateType = $returnDateType;
 | |
| 			return True;
 | |
| 		}
 | |
| 		return False;
 | |
| 	}	//	function setReturnDateType()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Return the current Return Date Format for functions that return a date/time (Excel, PHP Serialized Numeric or PHP Object)
 | |
| 	 *
 | |
| 	 * @access	public
 | |
| 	 * @category Function Configuration
 | |
| 	 * @return	 string		Return Date Format
 | |
| 	 *							Possible Return values are:
 | |
| 	 *								PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC		'P'
 | |
| 	 *								PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT		'O'
 | |
| 	 *								PHPExcel_Calculation_Functions::RETURNDATE_EXCEL			'E'
 | |
| 	 */
 | |
| 	public static function getReturnDateType() {
 | |
| 		return self::$ReturnDateType;
 | |
| 	}	//	function getReturnDateType()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * DUMMY
 | |
| 	 *
 | |
| 	 * @access	public
 | |
| 	 * @category Error Returns
 | |
| 	 * @return	string	#Not Yet Implemented
 | |
| 	 */
 | |
| 	public static function DUMMY() {
 | |
| 		return '#Not Yet Implemented';
 | |
| 	}	//	function DUMMY()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * DIV0
 | |
| 	 *
 | |
| 	 * @access	public
 | |
| 	 * @category Error Returns
 | |
| 	 * @return	string	#Not Yet Implemented
 | |
| 	 */
 | |
| 	public static function DIV0() {
 | |
| 		return self::$_errorCodes['divisionbyzero'];
 | |
| 	}	//	function DIV0()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * NA
 | |
| 	 *
 | |
| 	 * Excel Function:
 | |
| 	 *		=NA()
 | |
| 	 *
 | |
| 	 * Returns the error value #N/A
 | |
| 	 *		#N/A is the error value that means "no value is available."
 | |
| 	 *
 | |
| 	 * @access	public
 | |
| 	 * @category Logical Functions
 | |
| 	 * @return	string	#N/A!
 | |
| 	 */
 | |
| 	public static function NA() {
 | |
| 		return self::$_errorCodes['na'];
 | |
| 	}	//	function NA()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * NaN
 | |
| 	 *
 | |
| 	 * Returns the error value #NUM!
 | |
| 	 *
 | |
| 	 * @access	public
 | |
| 	 * @category Error Returns
 | |
| 	 * @return	string	#NUM!
 | |
| 	 */
 | |
| 	public static function NaN() {
 | |
| 		return self::$_errorCodes['num'];
 | |
| 	}	//	function NaN()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * NAME
 | |
| 	 *
 | |
| 	 * Returns the error value #NAME?
 | |
| 	 *
 | |
| 	 * @access	public
 | |
| 	 * @category Error Returns
 | |
| 	 * @return	string	#NAME?
 | |
| 	 */
 | |
| 	public static function NAME() {
 | |
| 		return self::$_errorCodes['name'];
 | |
| 	}	//	function NAME()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * REF
 | |
| 	 *
 | |
| 	 * Returns the error value #REF!
 | |
| 	 *
 | |
| 	 * @access	public
 | |
| 	 * @category Error Returns
 | |
| 	 * @return	string	#REF!
 | |
| 	 */
 | |
| 	public static function REF() {
 | |
| 		return self::$_errorCodes['reference'];
 | |
| 	}	//	function REF()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * NULL
 | |
| 	 *
 | |
| 	 * Returns the error value #NULL!
 | |
| 	 *
 | |
| 	 * @access	public
 | |
| 	 * @category Error Returns
 | |
| 	 * @return	string	#NULL!
 | |
| 	 */
 | |
| 	public static function NULL() {
 | |
| 		return self::$_errorCodes['null'];
 | |
| 	}	//	function NULL()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * VALUE
 | |
| 	 *
 | |
| 	 * Returns the error value #VALUE!
 | |
| 	 *
 | |
| 	 * @access	public
 | |
| 	 * @category Error Returns
 | |
| 	 * @return	string	#VALUE!
 | |
| 	 */
 | |
| 	public static function VALUE() {
 | |
| 		return self::$_errorCodes['value'];
 | |
| 	}	//	function VALUE()
 | |
| 
 | |
| 
 | |
| 	public static function isMatrixValue($idx) {
 | |
| 		return ((substr_count($idx,'.') <= 1) || (preg_match('/\.[A-Z]/',$idx) > 0));
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	public static function isValue($idx) {
 | |
| 		return (substr_count($idx,'.') == 0);
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	public static function isCellValue($idx) {
 | |
| 		return (substr_count($idx,'.') > 1);
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	public static function _ifCondition($condition) {
 | |
| 		$condition	= PHPExcel_Calculation_Functions::flattenSingleValue($condition);
 | |
| 		if (!isset($condition{0}))
 | |
| 			$condition = '=""';
 | |
| 		if (!in_array($condition{0},array('>', '<', '='))) {
 | |
| 			if (!is_numeric($condition)) { $condition = PHPExcel_Calculation::_wrapResult(strtoupper($condition)); }
 | |
| 			return '='.$condition;
 | |
| 		} else {
 | |
| 			preg_match('/([<>=]+)(.*)/',$condition,$matches);
 | |
| 			list(,$operator,$operand) = $matches;
 | |
| 
 | |
| 			if (!is_numeric($operand)) {
 | |
| 				$operand = str_replace('"', '""', $operand);
 | |
| 				$operand = PHPExcel_Calculation::_wrapResult(strtoupper($operand));
 | |
| 			}
 | |
| 
 | |
| 			return $operator.$operand;
 | |
| 		}
 | |
| 	}	//	function _ifCondition()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * ERROR_TYPE
 | |
| 	 *
 | |
| 	 * @param	mixed	$value	Value to check
 | |
| 	 * @return	boolean
 | |
| 	 */
 | |
| 	public static function ERROR_TYPE($value = '') {
 | |
| 		$value	= self::flattenSingleValue($value);
 | |
| 
 | |
| 		$i = 1;
 | |
| 		foreach(self::$_errorCodes as $errorCode) {
 | |
| 			if ($value === $errorCode) {
 | |
| 				return $i;
 | |
| 			}
 | |
| 			++$i;
 | |
| 		}
 | |
| 		return self::NA();
 | |
| 	}	//	function ERROR_TYPE()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * IS_BLANK
 | |
| 	 *
 | |
| 	 * @param	mixed	$value	Value to check
 | |
| 	 * @return	boolean
 | |
| 	 */
 | |
| 	public static function IS_BLANK($value = NULL) {
 | |
| 		if (!is_null($value)) {
 | |
| 			$value	= self::flattenSingleValue($value);
 | |
| 		}
 | |
| 
 | |
| 		return is_null($value);
 | |
| 	}	//	function IS_BLANK()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * IS_ERR
 | |
| 	 *
 | |
| 	 * @param	mixed	$value	Value to check
 | |
| 	 * @return	boolean
 | |
| 	 */
 | |
| 	public static function IS_ERR($value = '') {
 | |
| 		$value		= self::flattenSingleValue($value);
 | |
| 
 | |
| 		return self::IS_ERROR($value) && (!self::IS_NA($value));
 | |
| 	}	//	function IS_ERR()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * IS_ERROR
 | |
| 	 *
 | |
| 	 * @param	mixed	$value	Value to check
 | |
| 	 * @return	boolean
 | |
| 	 */
 | |
| 	public static function IS_ERROR($value = '') {
 | |
| 		$value		= self::flattenSingleValue($value);
 | |
| 
 | |
| 		if (!is_string($value))
 | |
| 			return false;
 | |
| 		return in_array($value, array_values(self::$_errorCodes));
 | |
| 	}	//	function IS_ERROR()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * IS_NA
 | |
| 	 *
 | |
| 	 * @param	mixed	$value	Value to check
 | |
| 	 * @return	boolean
 | |
| 	 */
 | |
| 	public static function IS_NA($value = '') {
 | |
| 		$value		= self::flattenSingleValue($value);
 | |
| 
 | |
| 		return ($value === self::NA());
 | |
| 	}	//	function IS_NA()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * IS_EVEN
 | |
| 	 *
 | |
| 	 * @param	mixed	$value	Value to check
 | |
| 	 * @return	boolean
 | |
| 	 */
 | |
| 	public static function IS_EVEN($value = NULL) {
 | |
| 		$value = self::flattenSingleValue($value);
 | |
| 
 | |
| 		if ($value === NULL)
 | |
| 			return self::NAME();
 | |
| 		if ((is_bool($value)) || ((is_string($value)) && (!is_numeric($value))))
 | |
| 			return self::VALUE();
 | |
| 		return ($value % 2 == 0);
 | |
| 	}	//	function IS_EVEN()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * IS_ODD
 | |
| 	 *
 | |
| 	 * @param	mixed	$value	Value to check
 | |
| 	 * @return	boolean
 | |
| 	 */
 | |
| 	public static function IS_ODD($value = NULL) {
 | |
| 		$value = self::flattenSingleValue($value);
 | |
| 
 | |
| 		if ($value === NULL)
 | |
| 			return self::NAME();
 | |
| 		if ((is_bool($value)) || ((is_string($value)) && (!is_numeric($value))))
 | |
| 			return self::VALUE();
 | |
| 		return (abs($value) % 2 == 1);
 | |
| 	}	//	function IS_ODD()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * IS_NUMBER
 | |
| 	 *
 | |
| 	 * @param	mixed	$value		Value to check
 | |
| 	 * @return	boolean
 | |
| 	 */
 | |
| 	public static function IS_NUMBER($value = NULL) {
 | |
| 		$value		= self::flattenSingleValue($value);
 | |
| 
 | |
| 		if (is_string($value)) {
 | |
| 			return False;
 | |
| 		}
 | |
| 		return is_numeric($value);
 | |
| 	}	//	function IS_NUMBER()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * IS_LOGICAL
 | |
| 	 *
 | |
| 	 * @param	mixed	$value		Value to check
 | |
| 	 * @return	boolean
 | |
| 	 */
 | |
| 	public static function IS_LOGICAL($value = NULL) {
 | |
| 		$value		= self::flattenSingleValue($value);
 | |
| 
 | |
| 		return is_bool($value);
 | |
| 	}	//	function IS_LOGICAL()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * IS_TEXT
 | |
| 	 *
 | |
| 	 * @param	mixed	$value		Value to check
 | |
| 	 * @return	boolean
 | |
| 	 */
 | |
| 	public static function IS_TEXT($value = NULL) {
 | |
| 		$value		= self::flattenSingleValue($value);
 | |
| 
 | |
| 		return (is_string($value) && !self::IS_ERROR($value));
 | |
| 	}	//	function IS_TEXT()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * IS_NONTEXT
 | |
| 	 *
 | |
| 	 * @param	mixed	$value		Value to check
 | |
| 	 * @return	boolean
 | |
| 	 */
 | |
| 	public static function IS_NONTEXT($value = NULL) {
 | |
| 		return !self::IS_TEXT($value);
 | |
| 	}	//	function IS_NONTEXT()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * VERSION
 | |
| 	 *
 | |
| 	 * @return	string	Version information
 | |
| 	 */
 | |
| 	public static function VERSION() {
 | |
| 		return 'PHPExcel 1.8.1, 2015-04-30';
 | |
| 	}	//	function VERSION()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * N
 | |
| 	 *
 | |
| 	 * Returns a value converted to a number
 | |
| 	 *
 | |
| 	 * @param	value		The value you want converted
 | |
| 	 * @return	number		N converts values listed in the following table
 | |
| 	 *		If value is or refers to N returns
 | |
| 	 *		A number			That number
 | |
| 	 *		A date				The serial number of that date
 | |
| 	 *		TRUE				1
 | |
| 	 *		FALSE				0
 | |
| 	 *		An error value		The error value
 | |
| 	 *		Anything else		0
 | |
| 	 */
 | |
| 	public static function N($value = NULL) {
 | |
| 		while (is_array($value)) {
 | |
| 			$value = array_shift($value);
 | |
| 		}
 | |
| 
 | |
| 		switch (gettype($value)) {
 | |
| 			case 'double'	:
 | |
| 			case 'float'	:
 | |
| 			case 'integer'	:
 | |
| 				return $value;
 | |
| 				break;
 | |
| 			case 'boolean'	:
 | |
| 				return (integer) $value;
 | |
| 				break;
 | |
| 			case 'string'	:
 | |
| 				//	Errors
 | |
| 				if ((strlen($value) > 0) && ($value{0} == '#')) {
 | |
| 					return $value;
 | |
| 				}
 | |
| 				break;
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}	//	function N()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * TYPE
 | |
| 	 *
 | |
| 	 * Returns a number that identifies the type of a value
 | |
| 	 *
 | |
| 	 * @param	value		The value you want tested
 | |
| 	 * @return	number		N converts values listed in the following table
 | |
| 	 *		If value is or refers to N returns
 | |
| 	 *		A number			1
 | |
| 	 *		Text				2
 | |
| 	 *		Logical Value		4
 | |
| 	 *		An error value		16
 | |
| 	 *		Array or Matrix		64
 | |
| 	 */
 | |
| 	public static function TYPE($value = NULL) {
 | |
| 		$value	= self::flattenArrayIndexed($value);
 | |
| 		if (is_array($value) && (count($value) > 1)) {
 | |
| 			$a = array_keys($value);
 | |
| 			$a = array_pop($a);
 | |
| 			//	Range of cells is an error
 | |
| 			if (self::isCellValue($a)) {
 | |
| 				return 16;
 | |
| 			//	Test for Matrix
 | |
| 			} elseif (self::isMatrixValue($a)) {
 | |
| 				return 64;
 | |
| 			}
 | |
| 		} elseif(empty($value)) {
 | |
| 			//	Empty Cell
 | |
| 			return 1;
 | |
| 		}
 | |
| 		$value	= self::flattenSingleValue($value);
 | |
| 
 | |
| 		if (($value === NULL) || (is_float($value)) || (is_int($value))) {
 | |
| 				return 1;
 | |
| 		} elseif(is_bool($value)) {
 | |
| 				return 4;
 | |
| 		} elseif(is_array($value)) {
 | |
| 				return 64;
 | |
| 		} elseif(is_string($value)) {
 | |
| 			//	Errors
 | |
| 			if ((strlen($value) > 0) && ($value{0} == '#')) {
 | |
| 				return 16;
 | |
| 			}
 | |
| 			return 2;
 | |
| 		}
 | |
| 		return 0;
 | |
| 	}	//	function TYPE()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Convert a multi-dimensional array to a simple 1-dimensional array
 | |
| 	 *
 | |
| 	 * @param	array	$array	Array to be flattened
 | |
| 	 * @return	array	Flattened array
 | |
| 	 */
 | |
| 	public static function flattenArray($array) {
 | |
| 		if (!is_array($array)) {
 | |
| 			return (array) $array;
 | |
| 		}
 | |
| 
 | |
| 		$arrayValues = array();
 | |
| 		foreach ($array as $value) {
 | |
| 			if (is_array($value)) {
 | |
| 				foreach ($value as $val) {
 | |
| 					if (is_array($val)) {
 | |
| 						foreach ($val as $v) {
 | |
| 							$arrayValues[] = $v;
 | |
| 						}
 | |
| 					} else {
 | |
| 						$arrayValues[] = $val;
 | |
| 					}
 | |
| 				}
 | |
| 			} else {
 | |
| 				$arrayValues[] = $value;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return $arrayValues;
 | |
| 	}	//	function flattenArray()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Convert a multi-dimensional array to a simple 1-dimensional array, but retain an element of indexing
 | |
| 	 *
 | |
| 	 * @param	array	$array	Array to be flattened
 | |
| 	 * @return	array	Flattened array
 | |
| 	 */
 | |
| 	public static function flattenArrayIndexed($array) {
 | |
| 		if (!is_array($array)) {
 | |
| 			return (array) $array;
 | |
| 		}
 | |
| 
 | |
| 		$arrayValues = array();
 | |
| 		foreach ($array as $k1 => $value) {
 | |
| 			if (is_array($value)) {
 | |
| 				foreach ($value as $k2 => $val) {
 | |
| 					if (is_array($val)) {
 | |
| 						foreach ($val as $k3 => $v) {
 | |
| 							$arrayValues[$k1.'.'.$k2.'.'.$k3] = $v;
 | |
| 						}
 | |
| 					} else {
 | |
| 						$arrayValues[$k1.'.'.$k2] = $val;
 | |
| 					}
 | |
| 				}
 | |
| 			} else {
 | |
| 				$arrayValues[$k1] = $value;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return $arrayValues;
 | |
| 	}	//	function flattenArrayIndexed()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Convert an array to a single scalar value by extracting the first element
 | |
| 	 *
 | |
| 	 * @param	mixed		$value		Array or scalar value
 | |
| 	 * @return	mixed
 | |
| 	 */
 | |
| 	public static function flattenSingleValue($value = '') {
 | |
| 		while (is_array($value)) {
 | |
| 			$value = array_pop($value);
 | |
| 		}
 | |
| 
 | |
| 		return $value;
 | |
| 	}	//	function flattenSingleValue()
 | |
| 
 | |
| }	//	class PHPExcel_Calculation_Functions
 | |
| 
 | |
| 
 | |
| //
 | |
| //	There are a few mathematical functions that aren't available on all versions of PHP for all platforms
 | |
| //	These functions aren't available in Windows implementations of PHP prior to version 5.3.0
 | |
| //	So we test if they do exist for this version of PHP/operating platform; and if not we create them
 | |
| //
 | |
| if (!function_exists('acosh')) {
 | |
| 	function acosh($x) {
 | |
| 		return 2 * log(sqrt(($x + 1) / 2) + sqrt(($x - 1) / 2));
 | |
| 	}	//	function acosh()
 | |
| }
 | |
| 
 | |
| if (!function_exists('asinh')) {
 | |
| 	function asinh($x) {
 | |
| 		return log($x + sqrt(1 + $x * $x));
 | |
| 	}	//	function asinh()
 | |
| }
 | |
| 
 | |
| if (!function_exists('atanh')) {
 | |
| 	function atanh($x) {
 | |
| 		return (log(1 + $x) - log(1 - $x)) / 2;
 | |
| 	}	//	function atanh()
 | |
| }
 | |
| 
 | |
| 
 | |
| //
 | |
| //	Strangely, PHP doesn't have a mb_str_replace multibyte function
 | |
| //	As we'll only ever use this function with UTF-8 characters, we can simply "hard-code" the character set
 | |
| //
 | |
| if ((!function_exists('mb_str_replace')) &&
 | |
| 	(function_exists('mb_substr')) && (function_exists('mb_strlen')) && (function_exists('mb_strpos'))) {
 | |
| 	function mb_str_replace($search, $replace, $subject) {
 | |
| 		if(is_array($subject)) {
 | |
| 			$ret = array();
 | |
| 			foreach($subject as $key => $val) {
 | |
| 				$ret[$key] = mb_str_replace($search, $replace, $val);
 | |
| 			}
 | |
| 			return $ret;
 | |
| 		}
 | |
| 
 | |
| 		foreach((array) $search as $key => $s) {
 | |
| 			if($s == '' && $s !== 0) {
 | |
| 				continue;
 | |
| 			}
 | |
| 			$r = !is_array($replace) ? $replace : (array_key_exists($key, $replace) ? $replace[$key] : '');
 | |
| 			$pos = mb_strpos($subject, $s, 0, 'UTF-8');
 | |
| 			while($pos !== false) {
 | |
| 				$subject = mb_substr($subject, 0, $pos, 'UTF-8') . $r . mb_substr($subject, $pos + mb_strlen($s, 'UTF-8'), 65535, 'UTF-8');
 | |
| 				$pos = mb_strpos($subject, $s, $pos + mb_strlen($r, 'UTF-8'), 'UTF-8');
 | |
| 			}
 | |
| 		}
 | |
| 		return $subject;
 | |
| 	}
 | |
| }
 | 
