Невозможно вызвать переменную вне array_filter()

Почему я не могу вызывать переменную вне array_filter(), это мой код

class JsonSelect
{
    public function jsonSource($jsonSource, $val){

        $file_contents = file_get_contents($jsonSource);

        if(!$file_contents){
            throw new Exception('Invalid file name');
        }

        $json = json_decode($file_contents, true);
        $q = $_POST['q'];
        $filtered = $json;

        if(strlen($q)) {
            $filtered = array_filter($json, function ($key) use ($q) {
                if (stripos($key[$val], $q) !== false) {
                    return true;
                } else {
                    return false;
                }
            });
        }

        echo json_encode(array_slice(array_values($filtered), 0, 20));
    }
}

и это моя картина, чтобы описать мою проблему. параметр $valне может быть вызван внутри $key[$val] введите здесь описание изображения


person Khoerodin    schedule 21.01.2016    source источник


Ответы (2)


Область действия переменных внутри анонимной функции ТОЛЬКО внутри анонимной функции.

Вам нужно наследовать переменную из родительской области. Вы можете найти более подробную информацию об этом в документации по PHP об анонимных функциях (пример # 3)

который преобразовал бы эту строку:

$filtered = array_filter($json, function ($key) use ($q) {

в это:

$filtered = array_filter($json, function ($key) use ($q, $val) {
person Dragos    schedule 21.01.2016
comment
Да! отлично работают.... спасибо, Драгис :) - person Khoerodin; 21.01.2016

Добавьте еще одну переменную в use:

$filtered = array_filter($json, function ($key) use ($q, $key) {
                if (stripos($key[$val], $q) !== false) {
                    return true;
                } else {
                    return false;
                }
            });

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

Одно из хороших объяснений можно найти здесь: https://teamtreehouse.com/community/variable-functions-vs-php-closures

... преимущество лямбды в том, что она существует только до тех пор, пока переменная, которой она назначена, имеет ссылку. Таким образом, PHP управляет памятью посредством подсчета ссылок. По сути, механизм PHP считывает все файлы, необходимые для выполнения программы, и при этом находит все используемые переменные и подсчитывает, сколько раз они используются (счетчик ссылок). Пока скрипт выполняется, каждый раз, когда используется переменная, он вычитает единицу из счетчика ссылок. Как только счетчик ссылок достигает нуля, переменная удаляется (более или менее). Обычно функция загружается в память и остается там на протяжении всего выполнения скрипта. Однако лямбда-выражение может быть удалено из памяти, как только счетчик ссылок его переменной достигнет нуля.

С другой стороны, замыкание — это анонимная функция, которая инкапсулирует часть глобальной области видимости во время ее создания. Другими словами, вы можете передать переменную в замыкание, используя ключевое слово «использовать», и значение этой переменной будет таким же, как и при создании замыкания, независимо от того, что происходит вне замыкания...

В основном ключевое слово use необходимо для создания изолированной области видимости для переменных. Без него вы не сможете добавить в функцию какую-либо дополнительную переменную.

person Adam    schedule 21.01.2016
comment
Пожалуйста, завершите ответ, добавив, почему он должен это сделать. Поскольку этот ответ в настоящее время есть, он не стоит ответа и должен был быть комментарием. - person Charlotte Dunois; 21.01.2016