note 97864 modified in language.types.array by danbrown

From: Date: Wed, 12 May 2010 19:25:46 +0000
Subject: note 97864 modified in language.types.array by danbrown
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-169195@lists.php.net to get a copy of this message
<?php /** * Functions for examining and manipulating matrices (n-dimensional arrays) of data * with string dot-separated paths. For example, you might do this with multidimensional * array: * $var = $array['someKey']['cats']['dogs']['potato']; * * Accomplishing this can be a nightmare if you don't know the depth of the path or the array * is of a variable dimension. * * You can accomplish the same by using $array as a Matrix: * $array = new Matrix($array); * $var = $array->get('someKey.cats.dogs.potato); * * @author Daniel Tomasiewicz <www.fourstaples.com> */ class Matrix { private $data; public function __construct(array $data = array()) { $this->data = $data; } /** * Gets the value at the specified path. */ public function get($path = null) { if($path === null) { return $this->data; } $segs = explode('.', $path); $target =& $this->data; for($i = 0; $i < count($segs)-1; $i++) { if(isset($target[$segs[$i]]) && is_array($target[$segs[$i]])) { $target =& $target[$segs[$i]]; } else { return null; } } if(isset($target[$segs[count($segs)-1]])) { return $target[$segs[count($segs)-1]]; } else { return null; } } /** * Sets a value to a specified path. If the provided value is * null, the existing value at the path will be unset. */ public function set($path, $value = null) { if(is_array($path)) { foreach($path as $p => $v) { $this->set($p, $v); } } else { $segs = explode('.', $path); $target =& $this->data; for($i = 0; $i < count($segs)-1; $i++) { if(!isset($target[$segs[$i]])) { $target[$segs[$i]] = array(); } $target =& $target[$segs[$i]]; } if($segs[count($segs)-1] == '*') { foreach($target as $key => $value) { $target[$key]; } } elseif($value === null && isset($target[$segs[count($segs)-1]])) { unset($target[$segs[count($segs)-1]]); } else { $target[$segs[count($segs)-1]] = $value; } } } /** * Returns a flattened version of the data (one-dimensional array * with dot-separated paths as its keys). */ public function flatten($path = null) { $data = $this->get($path); if($path === null) { $path = ''; } else { $path .= '.'; } $flat = array(); foreach($data as $key => $value) { if(is_array($value)) { $flat += $this->flatten($path.$key); } else { $flat[$path.$key] = $value; } } return $flat; } /** * Expands a flattened array to an n-dimensional matrix. */ public static function expand($flat) { $matrix = new Matrix(); foreach($flat as $key => $value) { $matrix->set($key, $value); } return $matrix; } } ?> --was-- <?php /** * Functions for examining and manipulating matrices (n-dimensional arrays) of data * with string dot-separated paths. For example, you might do this with multidimensional * array: * $var = $array['someKey']['cats']['dogs']['potato']; * * Accomplishing this can be a nightmare if you don't know the depth of the path or the array * is of a variable dimension. * * You can accomplish the same by using $array as a Matrix: * $array = new Matrix($array); * $var = $array->get('someKey.cats.dogs.potato); * * @author Daniel Tomasiewicz <www.fourstaples.com> */ class Matrix { private $data; public function __construct(array $data = array()) { $this->data = $data; } /** * Gets the value at the specified path. */ public function get($path = null) { if($path === null) { return $this->data; } $segs = explode('.', $path); $target =& $this->data; for($i = 0; $i < count($segs)-1; $i++) { if(isset($target[$segs[$i]]) && is_array($target[$segs[$i]])) { $target =& $target[$segs[$i]]; } else { return null; } } if(isset($target[$segs[count($segs)-1]])) { return $target[$segs[count($segs)-1]]; } else { return null; } } /** * Sets a value to a specified path. If the provided value is * null, the existing value at the path will be unset. */ public function set($path, $value = null) { if(is_array($path)) { foreach($path as $p => $v) { $this->set($p, $v); } } else { $segs = explode('.', $path); $target =& $this->data; for($i = 0; $i < count($segs)-1; $i++) { if(!isset($target[$segs[$i]])) { $target[$segs[$i]] = array(); } $target =& $target[$segs[$i]]; } if($segs[count($segs)-1] == '*') { foreach($target as $key => $value) { $target[$key]; } } elseif($value === null && isset($target[$segs[count($segs)-1]])) { unset($target[$segs[count($segs)-1]]); } else { $target[$segs[count($segs)-1]] = $value; } } } /** * Returns a flattened version of the data (one-dimensional array * with dot-separated paths as its keys). */ public function flatten($path = null) { $data = $this->get($path); if($path === null) { $path = ''; } else { $path .= '.'; } $flat = array(); foreach($data as $key => $value) { if(is_array($value)) { $flat += $this->flatten($path.$key); } else { $flat[$path.$key] = $value; } } return $flat; } /** * Expands a flattened array to an n-dimensional matrix. */ public static function expand($flat) { $matrix = new Matrix(); foreach($flat as $key => $value) { $matrix->set($key, $value); } return $matrix; } } http://php.net/manual/en/language.types.array.php

« previous php.notes (#169195) next »