如何在不改变顺序的情况下重命名对象属性?
对象例子:
$obj = new stdClass();
$obj->k1 = 'k1';
$obj->k2 = 'k2';
$obj->k3 = 'k3';
$obj->k4 = 'k4';
示例通过创建新属性重命名:
$obj->replace = $obj->k3;
unset($obj->k3);
结果:( k1=>k1, k2=>k2, k4=>k4, replace=>k3 )
看到问题了吗?
简单地重新创建对象属性会导致顺序改变。
我在数组中遇到了类似的问题,并提出了这个解决方案:
数组的实现方案
function replaceKey(&$array, $find, $replace)
{
if(array_key_exists($find, $array)){
$keys = array_keys($array);
$i = 0;
$index = false;
foreach($array as $k => $v){
if($find === $k){
$index = $i;
break;
}
$i++;
}
if ($index !== false) {
$keys[$i] = $replace;
$array = array_combine($keys, $array);
}
}
}
寻找类似的东西,但是一个函数将在对象上工作。
似乎找不到任何关于对象属性位置索引的文档
读取属性
$obj = new YourClass();
$backup = [];
foreach ($obj as $key => $value)
{
$backup[$key] = $value;
unset($obj->$key);
}
replaceKey($backup, $find, $replace);
foreach ($backup as $key => $value)
{
$obj->$key = $value;
}
既然你的数组有一个函数,为什么不这样做呢:
$array = (array) $obj;
$replacedKeyArray = replaceKey($array);
$newObject = (object) $replacedKeyArray;