出一道题 set("a.b.c", 123);//不明白为什么会出那样的结果,形参有固定吗?再举多个例子吧 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 $config = array();function set($path, $value) { global $config; $p = str_replace('.', "']['", $path); eval("\$config['$p'] = \$value;"); }function get($path='') { global $config; if(empty($path)) return $config; $p = str_replace('.', "']['", $path); return eval("return \$config['$p'];"); }set("a.b.c", 123);print_r(get());print_r(get("a.b.c")); 老大发话了,我就耍一回,数组学的不好,写写想法:function set($path, $value) {分割$path,写入数组array,然后array_push($array,$value)根据count($array)循环写入新的多维数组。//卡在这了????}function get($path='') {global $config;if(empty($path)) return $config;else{直接返回多位数组的最后一维的值。(可根据$path的个数判断此数组是几维)}} set("a.b.c", 123);//不明白为什么会出那样的结果,形参有固定吗?再举多个例子吧后面已经说了将给定的字符串"a.b.c"转换成$config的多级关联数组就是说会生成$config['a']['b']['c'] = 123;这样的数组需要说明的是set函数有覆盖性如set("a.b", 123);set("a.b.c", 345);操作是合法的,后面的操作会覆盖前面的,而get一个不存在的键值会返回NULL,如get("a.b.e.f") = null;并不会报错我开始也想到了EVAL,但是我上面提到的两个要求用EVAL就比较困难,而且eval让代码很难看懂,用引用的办法解决了。我的写法下班的时候贴,想看看都有什么思路, to jinliangonline(水清无鱼) 把你的 set() 补全function set($path, $value) { global $config; $p = explode('.', $path); $t =& $config; foreach($p as $k) { if(!isset($t[$k])) $t[$k] = array(); $t =& $t[$k]; } $t = $value;} 使用eval同样能保证“get一个不存在的键值会返回NULL”var_dump(get("a.b.c.p")); //out NULL而满足:set("a.b", 123);set("a.b.c", 345);操作是合法的,后面的操作会覆盖前面的,则需要function set($path, $value) { global $config; $p = explode('.', $path); $t =& $config; foreach($p as $k) { if(!is_array($t[$k])) $t[$k] = array(); $t =& $t[$k]; } $t = $value;}不过set("a.b", 123);set("a.b.c", 345);若产生Array( [a] => Array ( [b] => Array ( [0] => 12 [c] => 123 ) ))这样的数组,应该也是允许的吧?不过楼主并没有详细描述他的需求。 嗯。后面的算法和我的差不多我这个主要是应用在快速存取一些配置信息上,我用了一个类来包装class Config{ //配置数组 static private $ini = array(); //禁止访问构造函数 private function __construct() {} /** * 更改配置信息 * * 字符串可以使用set('dsn.driver','Mysql')的形式来设置子选项 * * @param string|array $key 键名 可以是数组或字符串 * @return */ public static function set($key, $value=null) { if(is_array($key) && is_null($value)) self::$ini = array_merge(self::$ini, $key); else { $arr = explode(".", $key); $pt = &self::$ini; while($arr) { if(!is_array($pt)) $pt = array(); $k = array_shift($arr); $pt = &$pt[$k]; } $pt = $value; } } //取得配置信息 public static function get($key=null) { if(is_null($key)) return self::$ini; $arr = explode(".", $key); //用引用方式查找关联数组 $pt = &self::$ini; while($arr) { if(!is_array($pt)) return null; $k = array_shift($arr); $pt = &$pt[$k]; } return $pt; } //载入配置文件或配置数组 public static function load($ini) { if(is_array($ini)) self::$ini = $ini; else { if(!file_exists($ini)) throw new Exception(sprintf("配置文件不存在 -> <span class='red'>%s</span>",$ini)); self::$ini = require_once($ini); } }}Config::set("a", 'test');Config::set("c.d.e.f", 123);Config::set("c.d.e", array(1,2,3));print_r(Config::get()); 不过set("a.b", 123);set("a.b.c", 345);产生...........这样的数组,应该也是允许的吧?这样的话前面的还要改一下if(!is_array($pt)) $pt = array();=>if(!is_array($pt) && isset($pt)) $pt = array($pt); set("a.b.c", 123);//结果为Array( [a] => Array ( [b] => Array ( [c] => 123 ) ))=====================那如果set("a.b.c.d", 123);得到Array( [a] => Array ( [b] => Array ( [c] => array ( [d] => 123 ) ) ))这样是不是就要覆盖上以层的? 还是要下面一样?Array( [a] => Array ( [b] => Array ( [c] => array ( [0] => 123 ) ) )) function set($path, $value){ global $config; $a = explode(',', $path); $t = array($a[count($a)-1] => $value); for($i = count($a)-2; $i>=0; $i--) { $t = array($a[$i] => $t); } $config = $t;} phpexcel 怎么创建成excel class问题 在php中如何使用java类 如何只删除session中某个元素? 求教 Vi 命令 彩创MyBook留言板 1.0 beta版发布!散分! mysql疑问:将表a中所有tid=5的数据插入到表b(两表结构相同),怎样写mysql语句? onfocus='this.blur()'是什么意思啊? 对象 转 数组 不会了 数据库连接问题!!!!急!在线等!!! 请高手告诉我应该如何学习php简单的入门知识我已经了解的差不多了
global $config;
$p = str_replace('.', "']['", $path);
eval("\$config['$p'] = \$value;");
}function get($path='') {
global $config;
if(empty($path)) return $config;
$p = str_replace('.', "']['", $path);
return eval("return \$config['$p'];");
}set("a.b.c", 123);
print_r(get());
print_r(get("a.b.c"));
function set($path, $value) {
分割$path,写入数组array,然后array_push($array,$value)
根据count($array)循环写入新的多维数组。//卡在这了????
}
function get($path='') {
global $config;
if(empty($path)) return $config;
else{直接返回多位数组的最后一维的值。(可根据$path的个数判断此数组是几维)}
}
//不明白为什么会出那样的结果,形参有固定吗?再举多个例子吧
后面已经说了
将给定的字符串"a.b.c"转换成$config的多级关联数组
就是说会生成
$config['a']['b']['c'] = 123;这样的数组需要说明的是
set函数有覆盖性
如
set("a.b", 123);
set("a.b.c", 345);
操作是合法的,后面的操作会覆盖前面的,
而get一个不存在的键值会返回NULL,
如
get("a.b.e.f") = null;
并不会报错我开始也想到了EVAL,但是我上面提到的两个要求用EVAL就比较困难,
而且eval让代码很难看懂,用引用的办法解决了。
我的写法下班的时候贴,想看看都有什么思路,
把你的 set() 补全
function set($path, $value) {
global $config;
$p = explode('.', $path);
$t =& $config;
foreach($p as $k) {
if(!isset($t[$k])) $t[$k] = array();
$t =& $t[$k];
}
$t = $value;
}
var_dump(get("a.b.c.p")); //out NULL而满足:
set("a.b", 123);
set("a.b.c", 345);
操作是合法的,后面的操作会覆盖前面的,
则需要
function set($path, $value) {
global $config;
$p = explode('.', $path);
$t =& $config;
foreach($p as $k) {
if(!is_array($t[$k])) $t[$k] = array();
$t =& $t[$k];
}
$t = $value;
}不过
set("a.b", 123);
set("a.b.c", 345);
若产生
Array
(
[a] => Array
(
[b] => Array
(
[0] => 12
[c] => 123
)
)
)
这样的数组,应该也是允许的吧?
不过楼主并没有详细描述他的需求。
{
//配置数组
static private $ini = array(); //禁止访问构造函数
private function __construct() {} /**
* 更改配置信息
*
* 字符串可以使用set('dsn.driver','Mysql')的形式来设置子选项
*
* @param string|array $key 键名 可以是数组或字符串
* @return
*/
public static function set($key, $value=null)
{
if(is_array($key) && is_null($value))
self::$ini = array_merge(self::$ini, $key);
else
{
$arr = explode(".", $key);
$pt = &self::$ini;
while($arr)
{
if(!is_array($pt)) $pt = array();
$k = array_shift($arr);
$pt = &$pt[$k];
}
$pt = $value;
}
} //取得配置信息
public static function get($key=null)
{
if(is_null($key)) return self::$ini;
$arr = explode(".", $key);
//用引用方式查找关联数组
$pt = &self::$ini;
while($arr)
{
if(!is_array($pt)) return null;
$k = array_shift($arr);
$pt = &$pt[$k];
}
return $pt;
} //载入配置文件或配置数组
public static function load($ini)
{
if(is_array($ini))
self::$ini = $ini;
else
{
if(!file_exists($ini))
throw new Exception(sprintf("配置文件不存在 -> <span class='red'>%s</span>",$ini));
self::$ini = require_once($ini);
} }}
Config::set("a", 'test');
Config::set("c.d.e.f", 123);
Config::set("c.d.e", array(1,2,3));
print_r(Config::get());
set("a.b", 123);
set("a.b.c", 345);产生...........这样的数组,应该也是允许的吧?
这样的话前面的还要改一下
if(!is_array($pt)) $pt = array();
=>
if(!is_array($pt) && isset($pt)) $pt = array($pt);
//结果为
Array
(
[a] => Array
(
[b] => Array
(
[c] => 123
)
)
)
=====================
那如果set("a.b.c.d", 123);得到
Array
(
[a] => Array
(
[b] => Array
(
[c] => array
(
[d] => 123
)
)
)
)
这样是不是就要覆盖上以层的?
Array
(
[a] => Array
(
[b] => Array
(
[c] => array
(
[0] => 123
)
)
)
)
{
global $config;
$a = explode(',', $path);
$t = array($a[count($a)-1] => $value);
for($i = count($a)-2; $i>=0; $i--)
{
$t = array($a[$i] => $t);
}
$config = $t;
}