Home > database >  PHP - iterate through different value types
PHP - iterate through different value types

Time:09-06

I have object of class $values like:

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'
)
)

All array keys are returning boolean type value expect one, which returns string value.

My result with the code:

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

returns list of feature names like:

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

What I want to edit is that for the last one we write its value NOT feature name ($value->getValue())

I am assuming that using in_array() PHP function would be the best approach here but I can't find a way to use it within my current method.

Tried with foreach() loop but nothing happens, like it's something wrong:

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

Can someone help?

Thanks

CodePudding user response:

You should probably operate on the feature code FEATURE_FLAGS, rather than assuming that the last feature in the array always contains the flags. Using your existing code, that could be as simple as:

$arrays = array_map(
    function($value)
    {
        /*
         * If the current Features object has the feature code FEATURE_FLAGS,
         * return the value itself, otherwise return the feature code in lowercase
         */
        return ($value->getFeature() == 'FEATURE_FLAGS') ? [$value->getValue()]:[strtolower((string) $value->getFeature())];
    },
    iterator_to_array($values)
);

If you want to define an array of feature codes that you need to treat this way, you can define it internally in the callback, but it is probably a better idea to define it externally. You can then pass it into the callback with use

/*
 * Define an array of feature codes that we want to return
 * values for
 */

$valueCaptureFeatures = ['FEATURE_FLAGS'];

$arrays = array_map(
    function($value) use ($valueCaptureFeatures) // <-- Put our $valueCaptureFeatures in the scope of the callback
    {
        /*
         * If the current Features object has a feature code in the $valueCaptureFeatures array,
         * return the value itself, otherwise return the feature code in lowercase
         */
        return (in_array($value->getFeature(), $valueCaptureFeatures)) ? [$value->getValue()]:[strtolower((string) $value->getFeature())];
    },
    iterator_to_array($values)
);

Working example:

// Mock the Features class
class Features
{
    private $feature;
    private $value;
    
    public function __construct($feature, $value)
    {
        $this->feature = $feature;
        $this->value   = $value;
    }
    
    public function getFeature()
    {
        return $this->feature;
    }
    
    public function setFeature($feature): void
    {
        $this->feature = $feature;
    }
    
    public function getValue()
    {
        return $this->value;
    }
    
    public function setValue($value): void
    {
        $this->value = $value;
    }
}

// Mock an iterator with test Feature instances
$values = new ArrayIterator( [
    new Features('CONNECT_NETWORKS_ON_SIGN_UP', 1),
    new Features('SHOW_BILLING', 1),
    new Features('FEATURE_FLAGS', 'activity')
]);

/*
 * Define an array of feature codes that we want to return
 * values for
 */

$valueCaptureFeatures = ['FEATURE_FLAGS'];

$arrays = array_map(
    function($value) use ($valueCaptureFeatures) // <-- Put our $valueCaptureFeatures in the scope of the callback
    {
        /*
         * If the current Features object has a feature code in the $valueCaptureFeatures array,
         * return the value itself, otherwise return the feature code in lowercase
         */
        return (in_array($value->getFeature(), $valueCaptureFeatures)) ? [$value->getValue()]:[strtolower((string) $value->getFeature())];
    },
    iterator_to_array($values)
);

$output =  array_merge(...$arrays);

$expectedResult = [
    'connect_networks_on_sign_up',
    'show_billing',
    'activity'
];

assert($output == $expectedResult, 'Result should match expectations');

print_r($output);

  • Related