我正在尝试通过使用此方法获取数组中每个项目的阶乘值,但这仅输出一个值 有谁能帮助我找到我做错了什么?
function mathh($arr, $fn){
for($i = 1; $i < sizeof($arr); $i++){
$arr2 = [];
$arr2[$i] = $fn($arr[$i]);
}
return $arr2;
}
$userDefined = function($value){
$x = 1;
return $x = $value * $x;
};
$arr = [1,2,3,4,5];
$newArray = mathh($arr, $userDefined);
print_r($newArray);
答案 0 :(得分:4)
您将需要一点递归,因此,您需要通过引用将lambda函数传递给自身:
%include "asm_io.inc"
segment .data
segment .bss
segment .text
global secret_func
secret_func:
enter 0,0
push ebx
mov ebx, [ebp + 8] ; first argument by gcc x86 calling convention
cmp ebx, 1
jne while_init
jmp case_one
while_init:
mov ecx, 2
while:
cmp ecx, ebx
jge case_two
xor edx, edx
mov eax, ebx
div ecx
cmp edx, 0
je case_one
add ecx, 1
jmp while
case_one:
mov eax, 0
jmp end
case_two:
mov eax, 1
end:
mov ebx, eax
pop ebx
leave
ret
输出:
function mathh($arr, $fn){
$arr2 = []; // moved the array formation out of the for loop so it doesn't get overwritten
for($i = 0; $i < sizeof($arr); $i++){ // starting $i at 0
$arr2[$i] = $fn($arr[$i]);
}
return $arr2;
}
$userDefined = function($value) use (&$userDefined){ // note the reference to the lambda function $userDefined
if(1 == $value) {
return 1;
} else {
return $value * $userDefined($value - 1); // here is the recursion which performs the factorial math
}
};
$arr = [1,2,3,4,5];
$newArray = mathh($arr, $userDefined);
print_r($newArray);
由于您本质上是在这种情况下创建数组映射,因此我想对此进行扩展。如果您要在函数Array
(
[0] => 1
[1] => 2
[2] => 6
[3] => 24
[4] => 120
)
中进行其他计算,则可以会很方便,但是如果您只想使用lambda函数创建具有范围的新数组,则可以执行此操作(利用我们已经创建的同一lambda):
mathh()
您将获得相同的输出,因为映射数组的范围(1,5)与原始数组相同:
$mapped_to_lambda = array_map($userDefined, range(1, 5));
print_r($mapped_to_lambda);