在foreach循环中重命名PHP Object属性

2uluyalo  于 2022-11-21  发布在  PHP
关注(0)|答案(2)|浏览(140)

我需要在foreach循环中更改一个PHP对象的键名:

stdClass Object
(
   [first-name] => NAME
   [last-name] => NAME
   [phone-number] => NUMBER
   ...
)

我需要将foreach中的破折号'-'替换为下划线'_',这样看起来就像这样:

stdClass Object
(
   [first_name] => NAME
   [last_name] => NAME
   [phone_number] => NUMBER
   ...
)

我找到了这个帖子:PHP - How to rename an object property?,它告诉我如何做,问题是当我在foreach中使用unset()时,它会取消设置所有的键,而不仅仅是我希望它取消设置的键。
下面是我的代码:

foreach ($customer as $key => $value) {
    $key2 = str_replace('-', '_', $key);
    $customer->$key2 = $customer->$key;            
    unset($customer->$key);
}

返回一个空对象:

stdClass Object
(
)

如何在不影响新关键点的情况下取消设置原始关键点?

vshtjzan

vshtjzan1#

有一个简单的技巧,你可以做一般,这是只做的操作,如果有一个变化:

$key2 = str_replace('-', '_', $key);
    if ($key2 !== $key) {
        $customer->$key2 = $customer->$key;            
        unset($customer->$key);
    }

你只是什么也不做,如果操作已经做了(由结果)。
foreach中,这可以通过使用continue关键字和反向比较来进一步“调整”:

foreach ($customer as $key => $value) {
    $key2 = str_replace('-', '_', $key);
    if ($key2 === $key) {
        continue; // nothing to do
    }
    $customer->$key2 = $customer->$key;            
    unset($customer->$key);
}

但最终你只不想删除which equals to always set(如果你先执行unset,然后在克隆上迭代,它就可以工作):

foreach (clone $customer as $key => $value) {
    $key2 = str_replace('-', '_', $key);
    unset($customer->$key);
    $customer->$key2 = $value;
}

所以选择你的武器,甚至有更多的方法来剥这只猫的皮,这只是为了灵感。在一天结束时,操作的顺序(添加,删除等)是“关键”点。
所有的examples on 3v4l.org

taor4pac

taor4pac2#

你的代码看起来似乎可以工作,但是在你循环通过的对象上工作是一个坏主意。解决方案是get_object_vars(),它可以在你循环之前获得属性:

foreach (get_object_vars($customer) as $key => $value) {
    $key2 = str_replace('-', '_', $key);
    $customer->$key2 = $customer->$key;            
    unset($customer->$key);
}

请参阅:https://3v4l.org/sfZq3

相关问题