对“函数”数组进行排序.在它们出现后返回值


Sort an array of "functions" after their occurance and return value

好,这就是作用域(必须从记忆中背诵,希望它有意义):一个包含"函数"的数组需要在它们出现和返回值之后排序,这样你就可以看到函数的顺序,它们需要被"加载"和它们的"依赖关系"。

不应该有重复,空返回值应该被忽略

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];
    }     
}