2015-03-08 88 views
0

我覺得這段代碼很難理解。如果我能用插圖和細節理解這一點,我將不勝感激。瞭解PHP中的高階函數

$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); 

回答

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); 
?> 
+0

謝謝。這很有幫助 – 2015-03-08 18:19:19

+0

偉大的清理和好點。這可能是某人試圖在一個php密碼生成例程中使用混淆來創建錯誤的安全感。 – dreftymac 2016-11-30 21:37:41