将函数存储在变量中

时间:2017-09-26 21:07:00

标签: php

我不明白这件事是如何运作的,但我需要创建一个新函数并将其存储在变量中。然后,通过使用array_filter,删除所有在特定年龄的狗。这是我到目前为止创建的内容:

$animals = [
  [ 'name' => 'Waffles', 'type' => 'dog', 'age'  => 12],
  [ 'name' => 'Fluffy',  'type' => 'cat', 'age'  => 14],
  [ 'name' => 'Spelunky', 'type' => 'dog', 'age'  => 4],
  [ 'name' => 'Hank'      , 'type' => 'dog', 'age'  => 11],
];


$youngDogs = function ($animals, $filter){    
    array_filter(
        $animals, 
        function($animals, $age = 5){
            $arr = [];
            if($animals['type'] == 'dog' && $animals['age'] < $age)
            {
                $arr = [
                    'name' => $animals['name'],
                    'type' => $animals['type'],
                    'age' => $animals['age'],
                ];
            }
            return $arr;
        }
    );
};


var_dump($youngDogs($animals, 5));

我的想法是创建一个新数组并存储符合条件的狗并将其返回,但是一切都很乱,函数返回NULL并且我不知道发生了什么。谁能给我一个提示?

3 个答案:

答案 0 :(得分:3)

  • 您需要use($age),因为array_filter只传递回调的一个参数
  • 您需要return array_filter来自您的功能
  • 的结果
  • array_filter期望从回调中返回truefalse
$youngDogs = function ($animals, $age){    
                return array_filter($animals, 
                    function($animal) use($age){
                        if($animal['type'] == 'dog' && $animal['age'] < $age) {
                            return false;
                        }
                        return true;
                    }
                );
             };

答案 1 :(得分:1)

您不需要定义新功能,只需在array_filter内创建一个匿名函数,如下所示:

$animals = [
    ['name' => 'Waffles', 'type' => 'dog', 'age' => 12],
    ['name' => 'Fluffy', 'type' => 'cat', 'age' => 14],
    ['name' => 'Spelunky', 'type' => 'dog', 'age' => 4],
    ['name' => 'Hank', 'type' => 'dog', 'age' => 11],
];

$animals = array_filter($animals, function ($animal) {
    return ($animal['type'] != 'dog' || $animal['age'] >= 5); // Keep if not a dog, or is a dog, and is over 5.
});

var_dump($animals);

eval.in demo

或者,如果你真的需要函数作为变量,试试这个:

$youngDogs = function ($animal) {
    return ($animal['type'] != 'dog' || $animal['age'] >= 5); // Keep if not a dog, or is a dog, and is over 5.
};

$animals = array_filter($animals, $youngDogs);

eval.in demo

答案 2 :(得分:0)

$animals = [
  [ 'name' => 'Waffles', 'type' => 'dog', 'age'  => 12],
  [ 'name' => 'Fluffy',  'type' => 'cat', 'age'  => 14],
  [ 'name' => 'Spelunky', 'type' => 'dog', 'age'  => 4],
  [ 'name' => 'Hank'      , 'type' => 'dog', 'age'  => 3],
];


$youngDogs = function ($animals, $age){
    return array_filter(
        $animals, 
        function($animals) use ($age){
            $arr = [];
            if($animals['type'] == 'dog' && $animals['age'] < $age)
            {
                $arr = [
                    'name' => $animals['name'],
                    'type' => $animals['type'],
                    'age' => $animals['age'],
                ];
            }
            return $arr;
        }
    );
};


var_dump($youngDogs($animals, 13));