当一个具有私有变量的对象已经转换(强制转换)为php中的数组时,数组元素键将以
开始* _
。如何删除数组键开头的“* _”?
例如
class Book {
private $_name;
private $_price;
}
投射后的数组
array('*_name' => 'abc', '*_price' => '100')
我想要
array('name' => 'abc', 'price' => '100')
答案 0 :(得分:8)
我是这样做的
class Book {
private $_name;
private $_price;
public function toArray() {
$vars = get_object_vars ( $this );
$array = array ();
foreach ( $vars as $key => $value ) {
$array [ltrim ( $key, '_' )] = $value;
}
return $array;
}
}
当我想将书籍对象转换为数组时,我调用了toArray()函数
$book->toArray();
答案 1 :(得分:3)
您可能遇到问题,因为您正在访问超出其允许范围的私有变量。
尝试更改为:
class Book {
public $_name;
public $_price;
}
或者,黑客:
foreach($array as $key => $val)
{
$new_array[str_replace('*_','',$key)] = $val;
}
答案 2 :(得分:3)
要正确执行此操作,您需要在班级中实施toArray()
方法。这样,您可以保护您的属性,并且仍然可以访问属性数组
有很多方法可以实现这一点,如果将对象数据作为数组传递给构造函数,这里有一种方法很有用。
//pass an array to constructor
public function __construct(array $options = NULL) {
//if we pass an array to the constructor
if (is_array($options)) {
//call setOptions() and pass the array
$this->setOptions($options);
}
}
public function setOptions(array $options) {
//an array of getters and setters
$methods = get_class_methods($this);
//loop through the options array and call setters
foreach ($options as $key => $value) {
//here we build an array of values as we set properties.
$this->_data[$key] = $value;
$method = 'set' . ucfirst($key);
if (in_array($method, $methods)) {
$this->$method($value);
}
}
return $this;
}
//just return the array we built in setOptions
public function toArray() {
return $this->_data;
}
您还可以使用getter和代码构建一个数组,以使数组看起来如您所愿。你也可以使用__set()和__get()来完成这项工作。
当所有的事情都说完了,目标就是拥有像以下一样的东西:
//instantiate an object
$book = new Book(array($values);
//turn object into an array
$array = $book->toArray();
答案 3 :(得分:1)
以下是将对象转换为数组
的步骤1)。将对象转换为数组
2)。将数组转换为json String。
3)。替换字符串以删除“* _”
e.g
$strArr= str_replace('\u0000*\u0000_','',json_encode($arr));
$arr = json_decode($strArr);