abstract class RecursiveArrayHelper { /** * @var string */ static private $separator='.'; /** * @param array $array * @param string $key * @return bool */ static public function has(array $array, $key) { assert('is_scalar($key)'); $keyParts = self::getKeyParts($key); return self::hasKeyParts($array, $keyParts); } /** * @param array $array * @param string $key * @param mixed $default * @return mixed */ static public function get(array $array, $key, $default=null) { assert('is_scalar($key)'); $keyParts = self::getKeyParts($key); return self::getByKeyParts($array, $keyParts, $default); } /** * @param array $array * @param string $key * @param mixed $value * @return array */ static public function set(array $array, $key, $value) { assert('is_scalar($key)'); $keyParts = self::getKeyParts($key); $array = self::setByKeyParts($array, $keyParts, $value); return $array; } /** * @return string */ static public function getSeparator() { return self::$separator; } /** * @param string $separator * @return void */ static public function setSeparator($separator) { assert('is_string($key) && strlen($separator)>0'); self::$separator = $separator; } /** * @param array $array * @param array $keyParts * @return bool */ static private function hasKeyParts(array $array, array $keyParts) { $currentKey = array_shift($keyParts); if(array_key_exists($currentKey, $array)) { if(!count($keyParts)) { return true; } else { return self::hasKeyParts($array[$currentKey], $keyParts); } } return false; } /** * @param array $array * @param array $keyParts * @param mixed $default * @return mixed */ static private function getByKeyParts(array $array, array $keyParts, $default) { $currentKey = array_shift($keyParts); if(array_key_exists($currentKey, $array)) { if(!count($keyParts)) { return $array[$currentKey]; } else { return self::getByKeyParts($array[$currentKey], $keyParts, $default); } } return $default; } /** * @param array $array * @param array $keyParts * @param mixed $value * @return array */ static private function setByKeyParts(array $array, array $keyParts, $value) { $currentKey = array_shift($keyParts); if(!array_key_exists($currentKey, $array)) { $array[$currentKey] = array(); } if(!count($keyParts)) { $array[$currentKey] = $value; return $array; } $array[$currentKey] = self::setByKeyParts($array[$currentKey], $keyParts, $value); return $array; } /** * @param string $key * @return array */ static private function getKeyParts($key) { return explode(self::$separator, $key); } }