理解PHP中的高阶函数

时间:2015-03-08 16:46:27

标签: php higher-order-functions

我发现这段代码很难理解。如果我能用插图和细节理解这一点,我将不胜感激。

$data = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

function get_algorithm($rand_seed_fnc) {
    return (odd_even($rand_seed_fnc())) ?
        function($value) {
           return $value * $value;
        } :
        function($value) use ($rand_seed_fnc) {
            return ($value * $value / $rand_seed_fnc()) + 10;
        };
}

function odd_even($value) {
    return ($value % 2 === 0);
}

$rand_seed_fnc = function() { return rand(); };
$results = array_map(get_algorithm($rand_seed_fnc), $data);

var_dump($results);

1 个答案:

答案 0 :(得分:2)

在您的示例中,使用多个返回,闭包,模糊处理,格式错误,嵌套函数,未使用的变量。 从我测试的内容来看,它也不会一直返回相同的值(浮动)。

我重新编写它来演示逻辑背后的意图,并花了一些时间在get_algorithm调用中解开未使用的$ rand_seed_fnc,并将可怕的函数解析为变量赋值。

<?php
    // Data to run functions on.
    $data = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

    function get_algorithm( $iValue ) 
    {
        // Check if value is odd or even and return a different value.
        // Replaces odd_even function.
        // Uses modulus %
        // $value = 1, returns FALSE;
        // $value = 2, returns TRUE;
        // $value = 3, returns FALSE;
        // $value = 4, returns TRUE;
        if( $iValue % 2 === 0 )
        {
            // Square the value if it's even.
            $iReturn = $iValue * $iValue;
        }
        else
        {
            // Square the value and divide by a random number then add 10.
            $iReturn = ( $iValue * $iValue / rand() ) + 10;
        }
        return $iReturn;
    }
    $results = array_map( 'get_algorithm', $data );
    var_dump($results);
?>