在这种情况下可以使用array_map而不是foreach


Is is possible to use array_map in this case instead of foreach?

我有以下foreach语句:

$classes = '';
foreach($uriSet as $uri) {
   if (request()->is($uri)) {
      $classes .= 'active';
   }
}

相反,我尝试使用这样的数组映射:

if (array_map([$this, 'checkUri'], $uriSet)) {
    $classes .= 'active';
}

// Somewhere down the class I have
public function checkUri($uri)
{
    return request()->is($uri);
}

但if语句似乎一直是CCD_ 1。我想将其提取到一个单独的方法中,因为我将以相同的方式在其他地方使用checkUri方法,但之后会执行不同的操作(而不是像这里那样设置类名)。

我用array_filter实现了这一点,就像这样:

if (array_filter($uriSet, [$this, 'checkUri'])) {
    $classes .= 'active';
}

array_map()返回一个数组,因此只有当它返回一个空数组时,if语句才会是false

http://php.net/manual/en/function.array-map.php

array array_map ( callable $callback , array $array1 [, array $... ] )
array_map()返回一个数组,该数组包含array1的所有元素在对每个应用回调函数之后。的编号回调函数接受的参数应该与数字匹配传递到array_map()的数组数

var_dump((bool) array(12)); // bool(true)
var_dump((bool) array());   // bool(false)

由于您使用的是Laravel,因此可以在Collection类上使用contains方法:

if (collect($uriSet)->contains([$this, 'checkUri'])) {
    $classes .= 'active';
}