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
相关产品推荐
相关产品推荐

