note 102281 added to function.array

From: Date: Sun, 06 Feb 2011 10:59:56 +0000
Subject: note 102281 added to function.array
Groups: php.notes 
Request: Send a blank email to php-notes+get-176711@lists.php.net to get a copy of this message
"Quick and dirty" class to get an offset of multidimensional array by given path (sorry, that without comments). <?php class ArrayAsPathException extends Exception {} class ArrayAsPath { protected $data = array(), $separator = '.'; public function __construct (array $data = array()) { $this->data = $data; } public function set ($value, $path = null) { if (!isset($path)) { $this->data = $value; } $separator = $this->separator; $pathtoken = strtok($path, $separator); $code = ''; $pices = '[\''.$pathtoken.'\']'; while ($pathtoken !== false) { if (($pathtoken = strtok($separator)) !== false) { $code .= 'if (!isset($this->data'.$pices.')) $this->data'.$pices.' = array(); '; $pices .= '[\''.$pathtoken.'\']'; } else { $code .= 'return $this->data'.$pices.' = $value;'; } } return eval($code); } public function get ($path = '', $default = null) { $result = $this->data; $separator = $this->separator; $pathtoken = strtok($path, $separator); while ($pathtoken !== false) { if (!isset($result[$pathtoken]) || is_string($result)) { if (isset($default)) { return $default; } throw new ArrayAsPathException ('Can\'t find "'.$pathtoken.'" in "'.$path.'"'); } $result = $result[$pathtoken]; $pathtoken = strtok($separator); } return $result ? $result : $default; } public function has ($path) { $result = $this->data; $separator = $this->separator; $pathtoken = strtok($path, $separator); while ($pathtoken !== false) { if (!isset($result[$pathtoken]) || is_string($result)) { return false; } $result = $result[$pathtoken]; $pathtoken = strtok($separator); } return true; } public function setSepatator ($separator) { $this->separator = $separator; } public function getSeparator ($separator) { return $this->separator; } } ?> Code: <?php $params = new ArrayAsPath; $params->set(array( 'foo' => array( 'bar' => array( 'item' => 'Value' ) ) )); try { $params->set('test', 'foo.bar.far.new'); printf( 'Array:<pre>%s</pre> foo.bar.item:<pre>%s</pre> foo.bar.far:<pre>%s</pre> foo.bar.far.new<pre>%s</pre>', var_export($params->get(), true), var_export($params->get('foo.bar.item'), true), var_export($params->get('foo.bar.far'), true), var_export($params->get('foo.bar.far.new'), true) ); } catch (ArrayAsPathException $e) { echo 'Oops! It seems that something is wrong. '.$e->getMessage(); } ?> Will display: Array: array ( 'foo' => array ( 'bar' => array ( 'item' => 'Value', 'far' => array ( 'new' => 'test', ), ), ), ) foo.bar.item: 'Value' foo.bar.far: array ( 'new' => 'test', ) foo.bar.far.new: 'test' ---- Server IP: 69.147.83.197 Probable Submitter: 94.245.160.183 ---- Manual Page -- http://www.php.net/manual/en/function.array.php Edit -- https://master.php.net/note/edit/102281 Del: integrated -- https://master.php.net/note/delete/102281/integrated Del: useless -- https://master.php.net/note/delete/102281/useless Del: bad code -- https://master.php.net/note/delete/102281/bad+code Del: spam -- https://master.php.net/note/delete/102281/spam Del: non-english -- https://master.php.net/note/delete/102281/non-english Del: in docs -- https://master.php.net/note/delete/102281/in+docs Del: other reasons-- https://master.php.net/note/delete/102281 Reject -- https://master.php.net/note/reject/102281 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#176711) next »