不定长字符转为多为数组

不定长字符转为多为数组

2016-06-14 17:55:54  回复(0  分享

今天看到一条很有趣的面试题:

不定长字符串,如$s="qwer";转换为数组$arr['q']['w']['e']['r']=1;

这题乍一看起来挺简单,但是深入想,却发现没那么容易实现。一开始我想到可以用多重循环将数组增维,然而开始动手写代码的时候发现根本没法实现。百思不得其解的时候忽然想到对象的特性。

如果有对象$obj1,如果赋值$obj2 = $obj1;,那么对$obj2的任何操作都会直接影响$obj1,因为此时$obj2是指向$obj1的。

除了对象,这种指向还有什么可以实现?想了想,突然想到指针,那么这题可以这么实现:设定一个数组A,然后循环字符串的每一位,定义一个指向数组A的临时变量,临时变量定义为数组,并新增当前字符串为键。

代码如下:

$str = 'qwer';

$len = strlen($str);

$arr = [];

$tmp = &$arr ;

for($i = 0; $i < $len; $i++){

if($i == $len - 1){

$tmp[$str[$i]] = 1;

}

$tmp = &$tmp[$str[$i]];

}

print_r($arr);

再想想,一开始我的思路就是想到对象,而PHP有一个可以将对象以数组的形式访问的写法,那么,利用这个思路,还可以使用对象实现而不用指针。搜索了一下ArrayAccess的资料,然后写下以下代码:

class arr implements ArrayAccess {

private $_container = array();

public function __construct() {

}

public function offsetSet($offset, $value) {

$this->_container[$offset] = $value;

}

public function offsetExists($offset) {

return isset($this->_container[$offset]);

}

public function offsetUnset($offset) {

unset($this->_container[$offset]);

}

public function offsetGet($offset) {

return isset($this->_container[$offset]) ? $this->_container[$offset] : NULL;

}

}

$arr = new arr();

$str = 'qwer';

$tmp = $arr;

$len = strlen($str);

for($i = 0; $i < $len; $i++){

if($i == $len - 1){

$tmp[$str[$i]] = 1;

} else {

$tmp[$str[$i]] = new arr();

}

$tmp = $tmp[$str[$i]];

}

print_r($arr);

当然,print_r出来的是一个对象,但是访问的时候可以直接访问$arr['q']['w']['e']['r']。

评论

发表评论:

*您的昵称:
*评论内容:
*您的性别:   
您的Email: (可选,您的留言被回复后用于提醒,不公开)