PHP Classes

File: ndArray.class.php

Recommend this page to a friend!
  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: 12 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 > 0 ? $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]) > 1 )
      {
      
$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) > 0 )
      {
      
$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])) > 0 ? 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;
 }

?>