在函数中访问方法之外的php变量

时间:2015-09-01 18:18:02

标签: php function variables laravel scope

我不明白为什么这不起作用?

我在php工作,特别是laravel。

当我运行它时,我得到一个未定义的变量异常。

我想我会得到bad_rows数组?

另外在一个侧面问题上,我怎么能重构这个更清洁?我应该将Excel方法提取到自己的函数吗?

我基本上是在尝试导入列表,将其添加到数据库中,然后我将重定向到主页面,其中包含未通过闪存导入的行列表。

谢谢!

public function subscriberImportList(Request $request)
{


    \Excel::filter('chunk')->load($request->file('import_list'))->chunk(100, function($rows) use($request)
    {


        $bad_rows = [];

        foreach($rows as $row) 
        {

            if (is_null($row->name) || is_null($row->street_address) || is_null($row->city)){

                array_push($bad_rows, $row->name);

                }

            else {

                //New Subscriber Instance
                $subscriber = new Subscriber;

                //Set the name
                $subscriber->name = $row->name;

                //Set the street address
                $subscriber->street_address = $row->street_address;

                //Set the city,state zip

                preg_match('/([^,]+),\s*(\w{2})\s*(\d{5}(?:-\d{4})?)/', $row->city, $city_state_zip_seperated);

                if (!$city_state_zip_seperated) {

                    array_push($bad_rows, $row->name);                        

                }
                else {

                    $subscriber->city = $city_state_zip_seperated[1];
                    $subscriber->state = $city_state_zip_seperated[2];
                    $subscriber->zipcode = $city_state_zip_seperated[3];

                    //Persist the subscriber to the database
                    $subscriber->save();
                }
            }
        }

        return $bad_rows;

    });

    dd($bad_rows);


}

1 个答案:

答案 0 :(得分:3)

你有:

public function subscriberImportList(Request $request) {
    \Excel::[..snip..], function($rows) use($request) {
        $bad_rows = [];
        ^^^^^^^^^^------defined here
        blah blah blah
    });
    dd($bad_rows);
        ^^^^^^^^---used here
}

$bad_rows只在INSIDE中定义function($rows)闭包,这意味着它是闭包内的局部变量,并且不存在于其他任何地方。因此,当您尝试dd($bad_rows)时,您使用的是未定义的变量。

你应该拥有的是

public function .... {
     $bad_rows = [];
     ^^^^^^^^^^^^^^^^
     \Exce..... function($row) use($request, $bad_rows) {
                                           ^^^^^^^^^^^^
            blah blah blah
     });
     dd($bad_rows);
}