Login   Register  
PHP Classes
elePHPant
Icontem

File: ndArray.class.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Brian Roach  >  ndArray  >  ndArray.class.php  >  Download  
File: ndArray.class.php
Role: Class source
Content type: text/plain
Description: Main class for ndArray
Class: ndArray
N-Dimensional Array
Author: By
Last change: Updated authors email address
Date: 2 years ago
Size: 7,020 bytes
 

Contents

Class file image Download
<?php
/*
@version .1
ndArray - A class that simulates a multi-dimentional database using array's.
Copyright (C) 2003

This program 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 2 of the License, or (at your option) any later version.

This program 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 this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

Brian Roach
worldwideroach@hotmail.com
Comments, critiques, and better ways are always welcome.
*/
class ndArray
{
 var 
$_aData// Array to store data
 
var $_aIndex// Array to store indexes
 
var $_aSettings// Array to store structure
 
var $_lastKey// The last key to be created

 /**
  * @return bool
  * @param aDimentions array
  * @desc Builds structure and sets rules; Input - Array of associative arrays with keys: 'fieldName','required'
  */
 
function ndArray($aDimentions)
  {
   return 
$this->__construct($aDimentions);
  }

 
/**
  * @return bool
  * @param aDimentions array
  * @desc PHP5 constructor
  */
 
function __construct($aDimentions)
  {
   if ( !
is_array($aDimentions) )
    {
     return 
false;
    }

   
$this->_lastKey 0;
   
$this->_aData = array();
   
$this->_aIndex = array();
   
$this->_aSettings = array();
   
$this->_aSettings['fields'] = array();

   foreach ( 
$aDimentions as $key=>$data )
    {
     if ( !isset(
$data['fieldName']) || !isset($data['required']) )
      {
       continue;
      }
     
$this->_aIndex[$data['fieldName']] = array();
     
$this->_aSettings['fields'][$data['fieldName']] = $data['required'];
    }
   return 
true;
  }

 
/**
  * @return array
  * @param iKey int
  * @desc Retreive a cell
  */
 
function get($iKey)
  {
   
$result = array();
   if ( 
is_array($iKey) )
    {
     foreach ( 
$iKey as $row=>$data )
      {
       if ( !isset(
$data['key']) || !is_array($data['key']) )
        {
         continue;
        }

       foreach ( 
$data['key'] as $keyRow=>$keyData )
        {
         
$tmp $this->get($keyData);
         if ( !
$tmp )
          {
           continue;
          }
         
$result[] = $tmp;
        }
      }
    }

   if ( 
is_int($iKey) )
    {
     
$result $this->_aData[$iKey];
    }

   return 
$result;
  }

 
/**
  * @return array
  * @param fieldValue array||string
  * @param fieldName string
  * @desc Lookup keys matching fieldValue; (optional) fieldName - specify field to look in
  */
 
function search($fieldValue$fieldName null)
  {
   
$aKeysFound = array();
   
$c 0;
   if ( !isset(
$fieldName) )
    {
     foreach ( 
$this->_aSettings['fields'] as $field=>$bIsRequired )
      {
       if ( isset(
$this->_aIndex[$field][$fieldValue]) )
        {
         
$aKeysFound[$c] = array();
         
$aKeysFound[$c]['key'] = $this->_aIndex[$field][$fieldValue];
         
$aKeysFound[$c++]['field'] = $field;
        }
      }
    }
   else
    {
     if ( isset(
$this->_aIndex[$fieldName][$fieldValue]) )
      {
       
$aKeysFound[$c] = array();
       
$aKeysFound[$c]['key'] = $this->_aIndex[$fieldName][$fieldValue];
       
$aKeysFound[$c++]['field'] = $fieldName;
      }
    }
   return 
$c $aKeysFound false;
  }

 
/**
  * @return int
  * @param aData array
  * @param key int
  * @desc Store the contents of aData
  */
 
function insert($aData$key null)
  {
   
$iKey = !$key ? ++$this->_lastKey $key;

   if ( !
$this->bIsDataValid($aData) )
    {
     return 
false;
    }

   
$this->_aData[$iKey] = $aData;
   
$this->_indexAdd($iKey$aData);
   return 
$iKey;
  }

 
/**
  * @return bool
  * @param iKey int
  * @desc Delete the specified cell and any associated indexes
  */
 
function delete($iKey)
  {
   if ( !isset(
$this->_aData[$iKey]) )
    {
     return 
false;
    }
   
$this->_indexRemove($iKey);
   
$this->_aData array_delete_key($this->_aData$iKey);
   return 
true;
  }

 
/**
  * @return bool
  * @param iKey int
  * @param aCell array
  * @desc Create indexes for the specified key
  */
 
function _indexAdd($iKey$aCell false)
  {
   
$aData is_array($aCell) ? $aCell $this->get($iKey);
   if ( !
$aData )
    {
     return 
false;
    }

   foreach ( 
$aData as $fieldName=>$fieldValue )
    {
     if ( !isset(
$this->_aIndex[$fieldName][$fieldValue]) )
      {
       
$this->_aIndex[$fieldName][$fieldValue] = array();
      }
     
$this->_aIndex[$fieldName][$fieldValue][] = $iKey;
    }
   return 
true;
  }

 
/**
  * @return bool
  * @param iKey int
  * @desc Remove the indexes associated with the specified key
  */
 
function _indexRemove($iKey)
  {
   if ( !
$aData $this->get($iKey) )
    {
     return 
false;
    }

   foreach ( 
$aData as $fieldName=>$fieldValue )
    {
     if ( !isset(
$this->_aIndex[$fieldName][$fieldValue]) || !is_array($this->_aIndex[$fieldName][$fieldValue]) )
      {
       continue;
      }
     
$aIndex =& $this->_aIndex[$fieldName];
     if ( 
count($aIndex[$fieldValue]) > )
      {
       
$iTmp array_search($iKey$aIndex[$fieldValue]);
       
$aIndex[$fieldValue] = array_delete_key($aIndex[$fieldValue], $iTmp);
      }
     else
      {
       
$aIndex array_delete_key($aIndex$fieldValue);
      }
    }
   return 
false;
  }

 
/**
  * @return bool
  * @desc Rebuild data indexes
  */
 
function reindex()
  {
   if ( !isset(
$this->_aData) || !is_array($this->_aData) )
    {
     return 
false;
    }
   
$oldData $this->_aData;
   
$this->_aData = array();
   
$this->_aIndex = array();
   foreach ( 
$oldData as $iKey=>$aData )
    {
     if ( 
count($aData) > )
      {
       
$this->insert($aData);
      }
    }

   return 
true;
  }

 
/**
  * @return bool
  * @param aData array
  * @desc Check to see if fields set as required are present
  */
 
function bIsDataValid($aData)
  {
   
$bIsValid true;
   foreach ( 
$this->_aSettings['fields'] as $fieldName=>$bIsRequired )
    {
     if ( !
$bIsRequired || !$bIsValid )
      {
       continue;
      }
     
$bIsValid strlen(trim($aData[$fieldName])) > true false;
    }
   return 
true;
  }
}

/**
 * @return Array
 * @param aInput Array
 * @param deleteKey mixed
 * @desc Delete a key from an array
 */
function array_delete_key($aInput$deleteKey)
 {
  
$aOutput = array();
  if ( !
is_array($aInput) )
   {
    return 
false;
   }

  foreach ( 
$aInput as $key=>$value )
   {
    if ( 
$key != $deleteKey )
     {
      
$aOutput[$key] = $value;
     }
   }
   return 
$aOutput;
 }

?>