PHP - назначить анонимную функцию переменной внутри своей собственной функции и использовать ее

Поэтому я пытаюсь сделать что-то вроде этого:

function func() {

    $call = function() {
        ...
    };

    $call();

}

Но это выдает ошибку, говорящую:

Имя функции должно быть строкой

Я также попытался вызвать функцию следующим образом:

$this->call();
call(); // and like this

И это не работает так же хорошо.

Есть ли причина, по которой я не могу делать то, что делаю?

РЕДАКТИРОВАТЬ

Кажется, это проблема исходного кода, а не в примере, который я написал

Это мой настоящий код:

$data = [...];
$menu_array = [];
$getChildren = function($id) {
          $children = [];
          foreach ($data as $node) {
              if ($id == $node["parent"]) {
                  array_push($children, $node);
              }
          } 
          return empty($children) ? null : $children;
        };

        $check = function($arr, $dat) {
            foreach ($dat as $node) {
                $children = $getChildren($node["id"]);
                if ($children == null) {
                    $arr[$node["display_name"]] = $node["model"];
                } else {
                    $arr[$node["display_name"]][] = $children;
                    $check($children);
                }
            }
        };
$check($menu_array, $data);

Ошибка выдается в этой строке:

$children = $getChildren($node["id"]);

1 ответ

Решение

То, что вы хотите сделать здесь, это рекурсия! Проблема в том, что PHP не добавляет автоматически какие-либо переменные из внешней области видимости в область действия функции. В вашем коде $check($children);переменная $check на самом деле не определено.

Вы можете исправить это, сказав PHP, что он должен использовать $getChildren а также $check переменная вне функции:

$getChildren = function($id) use (&$getChildren) {
   ...

а также

$check = function($arr, $dat) use (&$check, &$getChildren) {
  ...

Адаптировано с /questions/30487358/anonimnyie-rekursivnyie-funktsii-php/30487379#30487379

Другие вопросы по тегам