⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 row.php

📁 一款可以和GOOGLE媲美的开源统计系统,运用AJAX.功能强大. 无色提示:按照需要PHP5.1以上和MySQL数据库支持。
💻 PHP
字号:
<?php/** * Piwik - Open source web analytics *  * @link http://piwik.org * @license http://www.gnu.org/licenses/gpl-3.0.html Gpl v3 or later * @version $Id: Row.php 519 2008-06-09 01:59:24Z matt $ *  * @package Piwik_DataTable *//** * A DataTable is composed of rows. *  * A row is composed of: * - columns often at least a 'label' column containing the description  * 		of the row, and some numeric values ('nb_visits', etc.) * - metadata: other information never to be shown as 'columns' * - idSubtable: a row can be linked to a SubTable *  * IMPORTANT: Make sure that the column named 'label' contains at least one non-numeric character. * Otherwise the method addDataTable() or sumRow() would fail because they would consider * the 'label' as being a numeric column to sum. *  * @package Piwik_DataTable * @subpackage Piwik_DataTable_Row *  */class Piwik_DataTable_Row{	/**	 * This array contains the row information:	 * - array indexed by self::COLUMNS contains the columns, pairs of (column names, value) 	 * - (optional) array indexed by self::METADATA contains the metadata,  pairs of (metadata name, value)	 * - (optional) integer indexed by self::DATATABLE_ASSOCIATED contains the ID of the Piwik_DataTable associated to this row. 	 *   This ID can be used to read the DataTable from the DataTable_Manager.	 * 	 * @var array	 * @see constructor for more information	 */	public $c = array();		const COLUMNS = 0;	const METADATA = 1;	const DATATABLE_ASSOCIATED = 3;	/**	 * Efficient load of the Row structure from a well structured php array	 * 	 * @param array The row array has the structure	 * 					array( 	 * 						Piwik_DataTable_Row::COLUMNS => array( 	 * 										'label' => 'Piwik',	 * 										'column1' => 42,	 * 										'visits' => 657,	 * 										'time_spent' => 155744,		 * 									),	 * 						Piwik_DataTable_Row::METADATA => array(	 * 										'logo' => 'test.png'	 * 									),	 * 						Piwik_DataTable_Row::DATATABLE_ASSOCIATED => #Piwik_DataTable object (but in the row only the ID will be stored)	 * 					)	 */	public function __construct( $row = array() )	{		$this->c[self::COLUMNS] = array();		$this->c[self::METADATA] = array();		$this->c[self::DATATABLE_ASSOCIATED] = null;				if(isset($row[self::COLUMNS]))		{			$this->c[self::COLUMNS] = $row[self::COLUMNS];		}		if(isset($row[self::METADATA]))		{			$this->c[self::METADATA] = $row[self::METADATA];		}		if(isset($row[self::DATATABLE_ASSOCIATED])			&& $row[self::DATATABLE_ASSOCIATED] instanceof Piwik_DataTable)		{			$this->c[self::DATATABLE_ASSOCIATED] = $row[self::DATATABLE_ASSOCIATED]->getId();		}	}		/**	 * When destroyed, a row destroys its associated subTable if there is one	 */	public function __destruct()	{		$idSubtable = $this->c[self::DATATABLE_ASSOCIATED];		if($idSubtable !== null)		{			Piwik_DataTable_Manager::getInstance()->deleteTable($idSubtable);			$idSubtable = null;		}	}	/**	 * Applys a basic rendering to the Row and returns the output	 *	 * @return string characterizing the row. Example: - 1 ['label' => 'piwik', 'nb_uniq_visitors' => 1685, 'nb_visits' => 1861, 'nb_actions' => 2271, 'max_actions' => 13, 'sum_visit_length' => 920131, 'bounce_count' => 1599] [] [idsubtable = 1375]	 */	public function __toString()	{		$columns = array();		foreach($this->getColumns() as $column => $value)		{			if(is_string($value)) $value = "'$value'";			$columns[] = "'$column' => $value";		}		$columns = implode(", ", $columns);		$metadata = array();		foreach($this->getMetadata() as $name => $value)		{			if(is_string($value))			{				$name = "'$value'";			}			$metadata[] = "'$name' => $value";		}		$metadata = implode(", ", $metadata);		$output = "# [".$columns."] [".$metadata."] [idsubtable = " . $this->getIdSubDataTable()."]<br>\n";		return $output;	}		/**	 * Deletes the given column 	 *	 * @param string Column name	 * @return bool True on success, false if the column didn't exist	 */	public function deleteColumn( $name )	{		if(!isset($this->c[self::COLUMNS][$name]))		{			return false;		}		unset($this->c[self::COLUMNS][$name]);		return true;	}		/**	 * Returns the given column	 * 	 * @param string Column name	 * @return mixed|false The column value  	 */	public function getColumn( $name )	{		if(!isset($this->c[self::COLUMNS][$name]))		{			return false;		}		return $this->c[self::COLUMNS][$name];	}		/**	 * Returns the array of all metadata,	 * or the specified metadata  	 * 	 * @param string Metadata name	 * @return mixed|array|false 	 */	public function getMetadata( $name = null )	{		if(is_null($name))		{			return $this->c[self::METADATA];		}		if(!isset($this->c[self::METADATA][$name]))		{			return false;		}		return $this->c[self::METADATA][$name];	}		/**	 * Returns the array containing all the columns	 * 	 * @return array Example: array( 	 * 					'column1' 	=> VALUE,	 * 					'label' 	=> 'www.php.net'	 * 					'nb_visits' => 15894,	 * 			)	 */	public function getColumns()	{		return $this->c[self::COLUMNS];	}		/**	 * Returns the ID of the subDataTable. 	 * If there is no such a table, returns null.	 * 	 * @return int|null	 */	public function getIdSubDataTable()	{		return $this->c[self::DATATABLE_ASSOCIATED];	}		/**	 * Sums a DataTable to this row subDataTable.	 * If this row doesn't have a SubDataTable yet, we create a new one.	 * Then we add the values of the given DataTable to this row's DataTable.	 * 	 	 * @param Piwik_DataTable Table to sum to this row's subDatatable	 * @see Piwik_DataTable::addDataTable() for the algorithm used for the sum 	 */	public function sumSubtable(Piwik_DataTable $subTable)	{		$thisSubtableID = $this->getIdSubDataTable();		if($thisSubtableID === null)		{			$thisSubTable = new Piwik_DataTable;			$this->addSubtable($thisSubTable);		}		else		{			$thisSubTable = Piwik_DataTable_Manager::getInstance()->getTable( $thisSubtableID );		}				$thisSubTable->addDataTable($subTable);	}			/**	 * Set a DataTable to be associated to this row.	 * If the row already has a DataTable associated to it, throws an Exception.	 * 	 * @param Piwik_DataTable DataTable to associate to this row	 * @throws Exception 	 * 	 */	public function addSubtable(Piwik_DataTable $subTable)	{		if(!is_null($this->c[self::DATATABLE_ASSOCIATED]))		{			throw new Exception("Adding a subtable to the row, but it already has a subtable associated.");		}		$this->c[self::DATATABLE_ASSOCIATED] = $subTable->getId();	}		/**	 * Set a DataTable to this row. If there is already 	 * a DataTable associated, it is simply overwritten.	 * 	 * @param Piwik_DataTable DataTable to associate to this row	 */	public function setSubtable(Piwik_DataTable $subTable)	{		$this->c[self::DATATABLE_ASSOCIATED] = $subTable->getId();	}		/**	 * Set all the columns at once. Overwrites previously set columns.	 * 	 * @param array array( 	 * 					'label' 	=> 'www.php.net'	 * 					'nb_visits' => 15894,	 * 			)	 */	public function setColumns( $columns )	{		$this->c[self::COLUMNS] = $columns;	}		/**	 * Set the value $value to the column called $name.	 * 	 * @param string $name of the column to set	 * @param mixed $value of the column to set	 */	public function setColumn($name, $value)	{		if(isset($this->c[self::COLUMNS][$name])			|| $name != 'label')		{			$this->c[self::COLUMNS][$name] = $value;		}		// we make sure when adding the label it goes first in the table		else		{			$this->c[self::COLUMNS] = array($name => $value) + $this->c[self::COLUMNS];		}	}		/**	 * Add a new column to the row. If the column already exists, throws an exception	 * 	 * @param string $name of the column to add	 * @param mixed $value of the column to set	 * @throws Exception	 */	public function addColumn($name, $value)	{		if(isset($this->c[self::COLUMNS][$name]))		{			throw new Exception("Column $name already in the array!");		}		$this->c[self::COLUMNS][$name] = $value;	}			/**	 * Add a new metadata to the row. If the column already exists, throws an exception.	 * 	 * @param string $name of the metadata to add	 * @param mixed $value of the metadata to set	 * @throws Exception	 */	public function addMetadata($name, $value)	{		if(isset($this->c[self::METADATA][$name]))		{			throw new Exception("Metadata $name already in the array!");		}		$this->c[self::METADATA][$name] = $value;	}		/**	 * Sums the given $row columns values to the existing row' columns values.	 * It will sum only the int or float values of $row.	 * It will not sum the column 'label' even if it has a numeric value.	 * 	 * If a given column doesn't exist in $this then it is added with the value of $row.	 * If the column already exists in $this then we have	 * 		this.columns[idThisCol] += $row.columns[idThisCol]	 */	public function sumRow( Piwik_DataTable_Row $rowToSum )	{		foreach($rowToSum->getColumns() as $name => $value)		{			if($name != 'label' 				&& Piwik::isNumeric($value))			{				$current = $this->getColumn($name);				if($current === false)				{					$current = 0;				}				$this->setColumn( $name, $current + $value);			}		}	}			/**	 * Helper function to test if two rows are equal.	 * 	 * Two rows are equal 	 * - if they have exactly the same columns / metadata	 * - if they have a subDataTable associated, then we check that both of them are the same.	 * 	 * @param Piwik_DataTable_Row row1 to compare	 * @param Piwik_DataTable_Row row2 to compare	 * 	 * @return bool	 */	static public function isEqual( Piwik_DataTable_Row $row1, Piwik_DataTable_Row $row2 )	{				//same columns		$cols1 = $row1->getColumns();		$cols2 = $row2->getColumns();				uksort($cols1, 'strnatcasecmp');		uksort($cols2, 'strnatcasecmp');				if($cols1 != $cols2)		{			return false;		}				$dets1 = $row1->getMetadata();		$dets2 = $row2->getMetadata();				ksort($dets1);		ksort($dets2);				if($dets1 != $dets2)		{			return false;		}				// either both are null		// or both have a value		if( !(is_null($row1->getIdSubDataTable()) 				&& is_null($row2->getIdSubDataTable())			)		)		{			$subtable1 = Piwik_DataTable_Manager::getInstance()->getTable($row1->getIdSubDataTable());			$subtable2 = Piwik_DataTable_Manager::getInstance()->getTable($row2->getIdSubDataTable());			if(!Piwik_DataTable::isEqual($subtable1, $subtable2))			{				return false;			}		}		return true;	}}require_once "Row/DataTableSummary.php";

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -