gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 21:42:55 24 4
gpt4 key购买 nike

我在另一个函数中有这个匿名函数 $build_tree,它在 PHP 5.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 兼容代码?

最佳答案

通常,您可以使用对象的方法来执行此操作(回调可以是函数或对象的方法;后者允许您维护状态)。像这样(未经测试):

class BuildTree {
public $index, $updated = false;
public function __construct($index) {
$this->index = $index;
}
function foo(&$value, $key) {
if(array_key_exists($key, $this->index)) {
$value = $this-.index[$key];
$this->updated = true;
todel($key); }
}
}

do {
$build_tree_obj = new BuildTree($index);
array_walk_recursive($list, array($build_tree_obj, 'foo'));
} while($build_tree_obj->updated);

但是,array_walk_recursive 有一个特殊的功能,允许我们传递第三个参数,这是一个将被传递到函数的每次调用中的值。虽然值是按值传递的,但我们可以巧妙地使用对象(PHP 5 中的引用类型)来维护状态(来自 How to "flatten" a multi-dimensional array to simple one in PHP? ):

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

do {
$obj = (object)array('updated' => false);
array_walk_recursive($list, $build_tree, $obj);
} while($obj->updated);

关于php - 将 PHP 5.3 匿名函数转换为 5.2 兼容函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8236452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com