Как правило, вы можете сделать это, используя метод объекта (обратные вызовы могут быть либо функцией, либо методом объекта; последний позволяет вам поддерживать состояние). Как то так (не проверено):
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) для поддержания состояния (от Как «сгладить» многомерный массив до простого в 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);