好,这就是作用域(必须从记忆中背诵,希望它有意义):一个包含"函数"的数组需要在它们出现和返回值之后排序,这样你就可以看到函数的顺序,它们需要被"加载"和它们的"依赖关系"。
不应该有重复,空返回值应该被忽略
function human()
{
return "";
}
function animal()
{
return "";
}
function worker()
{
return "human";
}
function clerk()
{
return "human";
}
function manager()
{
return "clerk";
}
$task = array("human", "worker", "human", "worker", "clerk", "manager", "animal");
生成的数组应该如下所示
$result = array(
"human" => array(
"worker" => array(),
"clerk" => array(
"manager" => array(),
),
),
"animal" => array()
);
所以:人类首先需要被"装载",然后是工人、职员、经理和动物。工人和职员靠人,经理靠职员。
到目前为止,我得到了这个:
$result = array();
foreach($task as $function)
{
if(!in_array($function, $result))
{
$result[$function] = array();
}
$returnvallue = $function();
if(!empty($returnvallue) && !in_array($returnvallue, $result))
{
$result[$returnvallue] = array();
}
}
得到这个数组
$result = array(
"human" => array(),
"worker" => array(),
"clerk" => array(),
"manager" => array(),
"animal" => array()
);
但是它只显示了出现的顺序。
我难住了。
<?
function human()
{
return "";
}
function animal()
{
return "";
}
function worker()
{
return "human";
}
function clerk()
{
return "human";
}
function manager()
{
return "clerk";
}
function bird()
{
return "animal";
}
function coworker()
{
return "worker";
}
function things()
{
return "";
}
$task = array("bird","animal","manager","human", "worker","things","human", "worker", "clerk", "animal","coworker");
$result = array();
foreach($task as $function)
{
$tmp=array();
$tmp[]=$function;
$returnvalue = $function();
if(!empty($returnvalue))
{
$tmp[]=$returnvalue;
while(function_exists($returnvalue) && $returnvalue()<>"")
{
$tmp[]=$returnvalue=$returnvalue();
}
}
$tmp2 =& $result;
foreach (array_reverse($tmp) as $key)
{
if(!isset($tmp2[$key]))$tmp2[$key]=array();
$tmp2 =& $tmp2[$key];
}
}