| 
<?php
/**
 * Class to read LDIF data
 * @author tobozo <tobozo at phpsecure dot info>
 * @contributor Vladimir Struchkov <great_boba at yahoo dot com>
 * @contributor Wojciech Sznapka <wojciech at sznapka dot pl>
 * @copyleft (l) 2006-2009  tobozo
 * @package ldif2Array
 * @version 1.3
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 * @date 2006-12-13
 */
 
 class ldif2array {
 
 /**
 * stores file name
 * @type string
 */
 var $file;
 
 /**
 * store data
 * @type string
 */
 var $rawdata;
 
 /**
 * store entries
 * @type array
 */
 var $entries = array();
 
 
 //== constructor ====================================================================
 function ldif2array(/*string*/$file='', /*bool*/$process=false) {
 $this->file = $file;
 if($process) {
 $this->makeArray();
 }
 }
 
 
 /**
 * returns the array of LDIF entries
 * @return array
 */
 function getArray() {
 return $this->entries;
 }
 
 
 /**
 * Sanity check before building the array, returns false if error
 * @return bool
 */
 function makeArray() {
 if($this->file=='') {
 if($this->rawdata=='') {
 echo "No filename specified, aborting";
 return false;
 }
 } else {
 if(!file_exists($this->file)) {
 echo "File $this->file does not exist, aborting";
 return false;
 } else {
 $this->rawdata  = file_get_contents($this->file);
 }
 }
 
 if($this->rawdata=='') {
 echo "No data in file, aborting";
 return false;
 }
 
 $this->parse2array();
 return true;
 
 if(!$this->splitEntries()) {
 echo "Could not extract data from this file, aborting";
 return false;
 }
 $this->splitBlocks();
 sort($this->entries);
 return true;
 }
 
 
 /**
 * Build the array in two passes
 * @return void
 */
 function parse2array()  {
 /**
 * Thanks to Vladimir Struchkov <great_boba yahoo com> for providing the
 * code to extract base64 encoded values
 */
 
 $arr1=explode("\n",str_replace("\r",'',$this->rawdata));
 $i=$j=0;
 $arr2=array();
 
 /* First pass, rawdata is splitted into raw blocks */
 foreach($arr1 as $v)  {
 if (trim($v)=='') {
 ++$i;
 $j=0;
 } else {
 $arr2[$i][$j++]=$v;
 }
 }
 
 /* Second pass, raw blocks are updated with their name/value pairs */
 foreach($arr2 as $k1=>$v1) {
 $i=0;
 $decode=false;
 foreach($v1 as $v2) {
 if (ereg('::',$v2)) { // base64 encoded, chunk start
 $decode=true;
 $arr=explode(':',str_replace('::',':',$v2));
 $i=$arr[0];
 $this->entries[$k1][$i]=base64_decode($arr[1]);
 } elseif (ereg(':',$v2)) {
 $decode=false;
 $arr=explode(':',$v2);
 $count=count($arr);
 if ($count!=2)
 for($i=$count-1;$i>1;--$i)
 $arr[$i-1].=':'.$arr[$i];
 $i=$arr[0];
 
 // handling arrays in ldap entry
 if (isset($this->entries[$k1][$i])) {
 if (!is_array($this->entries[$k1][$i])) {
 $this->entries[$k1][$i]=array($this->entries[$k1][$i]);
 }
 $this->entries[$k1][$i][]=$arr[1];
 } else {
 $this->entries[$k1][$i]=$arr[1];
 }
 } else {
 if ($decode) { // base64 encoded, next chunk
 $this->entries[$k1][$i].=base64_decode($v2);
 } else {
 $this->entries[$k1][$i]=$v2;
 }
 }
 }
 }
 }
 
 
 
 }; // end class
 
 |