バリデーションに array_reduce を使う

foreach や array_reduce で同じ変数に複数の関数を適用するの記事の別の例。

function validate($input, $validators)
{
  $ret = [];
  foreach ($validators as $validator) {
    if (!$validator['func']($input)) {
      $ret[] = $validator['error'];
    }
  }
  return $ret;
}

function validate2($input, $validators)
{
  return array_reduce($validators,
    function($ret, $validator) use ($input) {
      if (!$validator['func']($input)) {
        $ret[] = $validator['error'];
  	  }
  	  return $ret;
    },
  []);
}

$validators = [
  [
    'func' => function($x) { return 0 < $x; },
    'error' => '0以上の値を入力してください'
  ],
  [
    'func' => function($x) { return $x < 10; },
    'error' => '10未満の値を入力してください'
  ]  
];

var_dump(validate2(11, $validators));