2017-09-26 125 views
0

我不明白这个东西是如何工作的,但我需要创建一个新函数并将其存储在一个变量中。然后,使用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
  • 您需要use($age)array_filter通行证只有一个参数回调
  • 你需要从你的函数
  • array_filter预计truefalse从回调返回returnarray_filter结果

$youngDogs = function ($animals, $age){  
       return array_filter($animals, 
        function($animal) use($age){ 
         if($animal['type'] == 'dog' && $animal['age'] < $age) { 
          return false; 
         } 
         return true; 
        } 
       ); 
      }; 
+0

谢谢!我从来不会想出如何使用'$ age'! – pidari

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)); 
+0

Jeez,就是这样!它最终奏效了。非常感谢你! – pidari

+0

1.变量'$ age'作为一个函数参数是无用的,因为它永远不会被传递,并且在那里将_always_作为默认值。 2.变量'$ filter'(OP似乎想用作'$ age')永远不会被使用。 –

+0

没问题,pidari。 –

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