我收到此错误,无法找到重新声明该函数的位置。
致命错误:无法在C:\ Users \ Secret \ SkyDrive \ Sites e Projetos中重新声明gera_array()(之前在C:\ Users \ Secret \ SkyDrive \ Sites e Projetos \ Rede Aranha \ t4.php:12中声明) \ Rede Aranha \ t4.php在第10行
代码:
function gera_ecards() {
// Funcao gera array de 5 numeros de 1 a 50 (com duplicados)
function gera_array() {
$ecard_rand = array();
for ($leo = 0; $leo < 5; $leo ++) {
$ecard_random = mt_rand(1,50);
array_push($ecard_rand, $ecard_random);
}
return $ecard_rand;
}
// Funcao remove duplicados da array
function array_has_dupes($ecard_rand) {
return count($ecard_rand) !== count(array_unique($ecard_rand));
}
do {
$ecard_rand = gera_array();
} while (array_has_dupes($ecard_rand));
sort($ecard_rand);
$ecard_rand = implode(",", $ecard_rand);
return $ecard_rand;
}
for ($leo = 0; $leo < 5; $leo ++) {
echo gera_ecards();
echo "<br>";
}
答案 0 :(得分:7)
你在函数内声明一个函数(为什么???):
function gera_ecards() {
// Funcao gera array de 5 numeros de 1 a 50 (com duplicados)
function gera_array() {
// ...
因此,每次调用gera_ecards()
函数时,都会再次声明函数gera_array()
。
你不应该在函数中声明函数。
答案 1 :(得分:3)
根据the manual,gera_ecards()
中的函数声明在全局范围内执行,可以看作是conditional declaration。
因此,两次调用gera_ecards()
会尝试两次声明内部函数。
如果您不希望外部代码调用内部函数,您可以选择匿名函数:
$gera_array = function() {
// ...
};
// Funcao remove duplicados da array
$array_has_dupes = function($ecard_rand) {
// ...
};
// etc.
否则,只需在gera_ecards()
之外声明这两个内部函数。
<强>更新强>
考虑使用shuffle()
,例如:
$heap = range(1, 50);
shuffle($heap);
foreach (array_chunk($heap, 5) as $block) {
sort($block);
echo join(",", $block), "\n";
}
答案 2 :(得分:1)
function gera_ecards() {
function gera_array() { }
function array_has_dupes() { }
}
每次致电gera_ecards()
新gera_array()
时,都会尝试申报。对函数中声明的函数没有专用的私有作用域。它们都共享相同的命名空间。
您可以将函数移到封闭函数之外,
function gera_array() { }
function gera_has_dupes() { }
function gera_ecards() { }
或开始编程object orientated并声明这两个函数private
class Gera {
private function has_dupes() { }
private function geraArray() { }
public function ecards() { }
}
或使用Closures(又名anonymous functions)。
function gera_ecards() {
$has_dupes = function() { }
$geraArray = function() { }
$has_dupes();
$geraArray();
}
答案 3 :(得分:1)
jeroen
清楚地概述了错误的解释要解决这个问题,请将这些功能分解为自己的功能并执行此操作:
<?php
// Funcao gera array de 5 numeros de 1 a 50 (com duplicados)
function gera_array()
{
$ecard_rand = array();
for ($leo = 0; $leo < 5; $leo++) {
$ecard_random = mt_rand(1, 50);
array_push($ecard_rand, $ecard_random);
}
return $ecard_rand;
}
// Funcao remove duplicados da array
function array_has_dupes($ecard_rand) {
return count($ecard_rand) !== count(array_unique($ecard_rand));
}
function gera_ecards() {
do {
$ecard_rand = gera_array();
} while (array_has_dupes($ecard_rand));
sort($ecard_rand);
$ecard_rand = implode(",", $ecard_rand);
return $ecard_rand;
}
for ($leo = 0; $leo < 5; $leo++) {
echo gera_ecards();
echo "<br>";
}
?>
输出:
3,10,12,30,35
9,13,24,26,30
15,27,38,39,42
25,35,44,45,49
12,18,21,40,42
答案 4 :(得分:1)
不嵌套功能,开始编程OOP ...... 您可能有多个包含在同一个文件中。
同时
if (!function_exists('gera_array')) {
function gera_array() { ... }
}