将PHP 5.3匿名函数转换为5.2兼容函数

将PHP 5.3匿名函数转换为5.2兼容函数,php,anonymous-function,Php,Anonymous Function,我在另一个函数中有一个匿名函数$build_tree,该函数在PHP5.3中运行良好 function nest_list($list) { $index = array(); index_nodes($list, $index); $build_tree = function(&$value, $key) use ($index, &$updated) { if(array_key_exists($key, $index)) { $value = $i

我在另一个函数中有一个匿名函数$build_tree,该函数在PHP5.3中运行良好

function nest_list($list) {
$index = array();
index_nodes($list, $index);

$build_tree = function(&$value, $key) use ($index, &$updated) {
    if(array_key_exists($key, $index)) {
        $value = $index[$key];
        $updated = true;
     todel($key); }
};

do {
    $updated = false;
    array_walk_recursive($list, $build_tree);
} while($updated);

return $list;
}

function index_nodes($nodes, &$index) {
    foreach($nodes as $key => $value) {
    if ($value) {
        $index[$key] = $value;
        index_nodes($value, $index);
                }
    }
}

如何将其转换为与PHP 5.2兼容的代码?

我认为如果不更改函数的调用方式,这是不可能的,因为在PHP 5.3中,lambda函数没有机制更改其调用范围内的变量(在本例中,
$updated

您可以按如下方式返回
$updated

$build_tree = create_function('&$value,$key,$updated','
    $index = '.var_export($index).';
    if(array_key_exists($key, $index)) {
        $value = $index[$key];
        $updated = true;
     todel($key); }
     return $updated;
');
$updated = $build_tree('the value','the key',$updated);
但你必须这样称呼它:

$build_tree = create_function('&$value,$key,$updated','
    $index = '.var_export($index).';
    if(array_key_exists($key, $index)) {
        $value = $index[$key];
        $updated = true;
     todel($key); }
     return $updated;
');
$updated = $build_tree('the value','the key',$updated);

通常,您可以使用对象的方法(回调可以是函数,也可以是对象的方法;后者允许您维护状态)。类似于此(未经测试):

但是,
array\u walk\u recursive
有一个特殊功能,允许我们传递第三个参数,这是一个将传递到函数每次调用中的值。虽然值是按值传递的,但我们可以巧妙地使用对象(PHP5中的引用类型)来维护状态(从):


我想我们还需要周围的代码来说明如何使用这个函数正确地重写算法。我已经用所有周围的代码和相关函数更新了这个问题。看起来你的代码被破坏了<代码>如果(数组\键\存在($key,$index))但是
数组\步\递归
(提问者正在使用)不会将任何数据返回给您