You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP遍历不同值类型:指定Feature返回对应Value的实现问题

问题:修改Features对象数组转换逻辑,让指定项返回Value而非Feature名称

我有一个App\ValueObject\Features类的对象数组$values,结构如下:

Array
(
[0] => App\ValueObject\Features Object
(
[feature:App\ValueObject\Features:private] => CONNECT_NETWORKS_ON_SIGN_UP
[value:App\ValueObject\Features:private] => 1
)

[1] => App\ValueObject\Features Object
(
[feature:App\ValueObject\Features:private] => SHOW_BILLING
[value:App\ValueObject\Features:private] => 1
)

[2] => App\ValueObject\Features Object
(
[feature:App\ValueObject\Features:private] => FEATURE_FLAGS
[value:App\ValueObject\Features:private] => 'activity'
)
)

其中大部分元素的value为布尔类型,仅FEATURE_FLAGS对应的value是字符串类型。

当前我用这段代码转换数组:

$arrays = array_map(
    function($value) { return [strtolower((string) $value->getFeature())]; },
    iterator_to_array($values)
);
return array_merge(...$arrays);

返回结果:

"features": [
    "connect_networks_on_sign_up",
    "show_billing",
    "feature_flags"
]

我需要修改代码,让FEATURE_FLAGS对应的元素返回其value(调用$value->getValue())而非feature名称。尝试过foreach循环但没生效:

$features = [];
foreach ($values as $value)
{
    $setParam = $value->getFeature();
    if ($value == 'FEATURE_FLAGS') {
        $setParam = $value->getValue();
    }
    $features[] = strtolower((string) $setParam);
}
return $features;

问题根源

你的foreach循环失效是因为判断条件错误:你直接拿$value(Features对象实例)和字符串'FEATURE_FLAGS'做比较,这永远不会相等。正确的做法是判断对象的feature属性值,也就是调用$value->getFeature()的返回值。

修正后的解决方案

方案1:修正foreach循环

$features = [];
// 先把迭代器转为数组(如果$values是迭代器的话)
$valuesArray = iterator_to_array($values);
foreach ($valuesArray as $value) {
    $currentFeature = $value->getFeature();
    if ($currentFeature === 'FEATURE_FLAGS') {
        // 对于FEATURE_FLAGS,取它的value值
        $item = $value->getValue();
    } else {
        // 其他项取小写的feature名称
        $item = strtolower((string)$currentFeature);
    }
    $features[] = $item;
}
return $features;

方案2:用array_map实现(保留你原有的代码风格)

$features = array_map(function($value) {
    $currentFeature = $value->getFeature();
    return $currentFeature === 'FEATURE_FLAGS' 
        ? $value->getValue() 
        : strtolower((string)$currentFeature);
}, iterator_to_array($values));
return $features;

最终返回结果

修正后得到的features数组会变成:

"features": [
    "connect_networks_on_sign_up",
    "show_billing",
    "activity"
]

内容的提问来源于stack exchange,提问作者Filip Stojavonic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:05:22