重命名对象属性,同时保持其位置


PHP Rename object property while maintaining its position

如何在不改变顺序的情况下重命名对象属性?

对象例子:

$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;