PHP重命名对象属性,同时保持其位置
如何在不更改顺序的情况下重命名对象属性? 对象示例:PHP重命名对象属性,同时保持其位置,php,oop,object,Php,Oop,Object,如何在不更改顺序的情况下重命名对象属性? 对象示例: $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 ) 通过创建新属性重命名示例:
$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 )
通过创建新属性重命名示例:
$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 )
结果:
$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);
}
}
}
寻找类似的东西,但一个功能,将在对象上工作
似乎找不到有关对象属性位置索引的任何文档。既然您有一个数组函数,为什么不执行以下操作:
$array = (array) $obj;
$replacedKeyArray = replaceKey($array);
$newObject = (object) $replacedKeyArray;
因此,请阅读您的属性
$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;
}
如果对象中的属性需要特定的顺序,那么您就做错了imho.Oh,
$index=array\u search($keys,$find,true)
将大大缩短代码:)不,这会破坏它,如果您有一个包含相关键和整数的混合数组,例如['k1'=>'v1','v2','k3'=>'v3']关于数组搜索()
,它将失败。。它应该与array\u slice()
结合起来才能在您的特定情况下正常工作。但是array\u搜索不是更昂贵吗?我在某处读到数组搜索在找到值之前对数组进行排序。另外,添加slice会引入另一个调用。一旦找到密钥,foreach循环将中断,并应用尽可能少的负载。这会起作用,但会有点挫败首先拥有对象的目的。将对象转换为数组也会杀死它的方法。@DieterGribnitz您的示例显示了一个匿名对象;如果你指的是常规对象,你应该这么说。然后在类中创建一个静态方法,该方法将获取原始PHP对象并返回该类的对象,否则这是不可行的,甚至PHP反射也没有更改键名的方法。谢谢,这一总体思路应该可行。真不敢相信我居然没想到。我觉得我的大脑有点油炸了。还将添加检查以仅更改公共属性。完成后将发布我的功能。