Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP重命名对象属性,同时保持其位置_Php_Oop_Object - Fatal编程技术网

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反射也没有更改键名的方法。谢谢,这一总体思路应该可行。真不敢相信我居然没想到。我觉得我的大脑有点油炸了。还将添加检查以仅更改公共属性。完成后将发布我的功能。