【问题标题】:How can I refactor this code that tests if multiple array values are inside another arrays specific key?如何重构测试多个数组值是否在另一个数组特定键内的代码?
【发布时间】:2023-03-29 05:44:02
【问题描述】:

我有一个返回房间的类。我有几个方法 ( 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 列表,但这会“困扰”该函数,而且我认为它不会像现在这样“纯粹”。

编辑#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 个不同的功能做同样的事情。

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

【问题讨论】:

    标签: php arrays refactoring


    【解决方案1】:

    您可以使用ouzo-goodies 喜欢:

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

    这里是链接:Functions::extractArrays::map

    //编辑

    这里有两个可以用作助手的类。

    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);
        }
    }
    

    【讨论】:

    • 这是相当甜美的语法,但你能想出一种不需要包含另一个库的方法吗?我只是希望任何可以继承我的项目的人更容易使用代码而不是尝试从 3rd 方库中学习含糖的语法。我个人喜欢这样,但不是每个人都喜欢。
    • 关于创建getBuildingIDs 方法 - 问题是我必须为每个其他函数创建这些方法 4-5 次,这可能太多余了?
    • 这有点连线,您可以将任何库包含到您的项目中。您可以创建一些静态方法作为辅助方法,并将建筑物作为参数并从中提取id
    猜你喜欢
    • 2012-08-29
    • 2017-07-02
    • 2018-08-14
    • 1970-01-01
    • 2012-05-06
    • 2010-12-31
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多