我如何重构这段代码来测试多个数组值是否在另一个特定于数组的键中


How can I refactor this code that tests if multiple array values are inside another arrays specific key?

我有一个返回房间的类。我有几个方法(4-5),所有这些方法都提取"可用"参数,用户可以指定给这个API以返回唯一的结果。

在其中一种方法中,我检查用户提供的"建筑"字符串是否与"有效"建筑匹配。为了做到这一点,目前我正在做:

$buildings = $this->_getBuildings();
$buildingIds = array();
foreach ( $buildings as $building ) {
     $buildingIds[] = $building['id'];
}
$valid = true;
foreach ( $userPassedBuildingValues as $value ) {
   if ( !in_array( $value, $buildingIds ) ) {
       $valid = false;
       $this->addError();
   }
}

我正在寻找一种重构方法,这样我就不必每次进行比较时都遍历所有的构建元素并创建一个新的数组。是否有任何数组映射/搜索功能可以使这更容易?

我曾考虑重构getBuildings,让它有一个可选的参数来返回ID列表,但这会"困扰"函数,我认为它不会像现在这样"纯粹"。

EDIT#1:第一个想法是创建一个方法,该方法接受一个"键",并从数组中返回这些键的串联数组。例如,

$buildings = $this->_getBuildings();
$buildingIds = $this->_getAllValues( 'id', $buildings );
function _getAllValues( $key, $array ) {
   $return = array();
   foreach ( $array as $rowKey => $row ) {
       if ( $rowKey == $key )
           $return[] = $row[$key]
   }
   return $return;
}

但也许还有一种不同的、更清洁的方法?我会为至少4-5个不同的功能做同样的事情。

注意:数组的深度不会超过一个,所以不必担心嵌套很深的数组。

您可以使用类似以下的ouzo好东西:

$buildingIds = Arrays::map($buildings, Functions::extract()->id);

以下是链接:函数::提取,数组::映射。

//编辑

这里有两个类可以用作辅助对象。

class Helper
{
    public static function getBuldingIds($buildings)
    {
        return Arrays::map($buildings, Functions::extract()->id);
    }
}
class Helper
{
    public static function getBuldingIds($buildings)
    {
        return array_map(function($building){
            return $building['id'];
        }, $buildings);
    }
}