【问题标题】:PHP array_walk() in class with multiple arguments具有多个参数的类中的 PHP array_walk()
【发布时间】:2015-07-20 07:33:20
【问题描述】:

早安,

我遇到了以下问题。 在我想用 array_walk 调用的类中有一个方法,带有两个参数。

array_walk($fields, array($this, 'SetAlias'), $Table);

当我在 SetAlias() 方法中添加评论时,它会做出响应。因此它被调用了。

被调用的方法是:

private function SetAlias($value, $table){
    if(isset($this->alias[$table][$value]) === true){
            $value = $value.'` AS `'.$this->alias[$table][$value];
    }
    return($value);
}

参数

但是当我打印它返回的函数参数时:

Array
    (
        [0] => parking_id
        [1] => 0
        [2] => parking
    )

很遗憾,这对我不起作用。

所以我可以将方法的参数更改为:

private function SetAlias($value, $null, $table){

还是没有结果。

代码

<?php

class Test {
    public  $fields                     =   array('parking' => array('parking_id', 'parking_country', 'parking_name'));
    public  $alias                          =   array();



    private function SetAlias($value, $table){
        if(isset($this->alias[$table][$value]) === true){
                $value = $value.'` AS `'.$this->alias[$table][$value];
        }
        return($value);
    }


    public function GetFields($Table){
        $fields = $this->fields[$Table];

        if(isset($this->alias[$Table]) === true){
            array_walk($fields, array($this, 'SetAlias'), $Table);
        }

        return('`'.implode($fields, '`, `').'`');
    }

}





$example = new Test();
$example->alias['parking'] = array('parking_id'=>'id', 'parking_country'=>'country');

echo $example->GetFields('parking');
?>

目前返回:

parking_idparking_countryparking_name

我错过了什么?

VolkerK 的作品

public function GetFields($table){
    $fields = $this->fields[$table];

    if(isset($this->alias[$table]) === true) {
        $fn = function($e) use ($table) {
            return $this->SetAlias($e, $table);
        };
        $fn = $fn->BindTo($this);
        $fields = array_map( $fn, $fields );
    }

    return('`'.implode($fields, '`, `').'`');
}

但在静态上下文中不起作用。有没有可能做到这一点 工作吗?

$fn = $fn->BindTo(__CLASS__);
$SetFields = array_map( $fn, $SetFields );
  • 警告:Closure::bindTo() 期望参数 1 是对象,给定字符串

静态上下文

<?php

class Test {
    public static $fields                           =   array('parking' => array('parking_id', 'parking_country', 'parking_name'));
    public static $alias                            =   array();

    private static function SetAlias($value, $table){
        if(isset(self::$alias[$table][$value]) === true){
            $value = $value.'` AS `'.self::$alias[$table][$value];
        }
        return($value);
    }


    public static function GetFields($table){
        $fields = self::$fields[$table];

        if(isset(self::$alias[$table]) === true) {
            $fn = function($e) use ($table) {
                return self::SetAlias($e, $table);
            };
            $fn = $fn->BindTo(__CLASS__);
            $fields = array_map( $fn, $fields );
        }

        return('`'.implode($fields, '`, `').'`');
    }
}





Test::$alias['parking'] = array('parking_id'=>'id', 'parking_country'=>'country');

echo Test::GetFields('parking');
?>

作品VolkerK

 <?php
class Test {
    public static $fields   = array('parking' => array('parking_id', 'parking_country', 'parking_name'));
    public static $alias    = array();

    private static function SetAlias($value, $table){
        if(isset($table[$value]) === true){
            $value = $value.'` AS `'.$table[$value];
        }
        return($value);
    }

    protected static function getFieldMapper($table) {
        if( !isset(self::$alias[$table]) ) {
            return function($e) { return $e; };
        }

        $table = self::$alias[$table];
        return function($e) use ($table) {
            return Test::SetAlias($e, $table);
        };
    }

    public static function GetFields($table){
        $fields = array_map( self::getFieldMapper($table), self::$fields[$table]);
        return('`'.implode($fields, '`, `').'`');
    }
}
?>

【问题讨论】:

    标签: php class array-walk


    【解决方案1】:

    array_walk 返回一个布尔值,它不会改变输入数组,因此您不会以这种方式将 SetAlias() 中的值返回到 GetFields()。
    但你可以改用aray_map()

    <?php
    class Test {
        public  $fields = array('parking' => array('parking_id', 'parking_country', 'parking_name'));
        public  $alias  = array();
    
        private function SetAlias($value, $table) {
            if(isset($this->alias[$table][$value]) === true){
                $value = $value.'` AS `'.$this->alias[$table][$value];
            }
            return($value);
        }
    
    
        public function GetFields($table){
            $fields = $this->fields[$table];
    
            if(isset($this->alias[$table]) === true) {
                $fn = function($e) use ($table) {
                    return $this->SetAlias($e, $table);
                };
                $fn = $fn->BindTo($this);
                $fields = array_map( $fn, $fields );
            }
    
            return('`'.implode($fields, '`, `').'`');
        }
    }
    

    编辑:对于您的静态类:

        if(isset(self::$alias[$table]) === true) {
            $fn = function($e) use ($table) {
                return Test::SetAlias($e, $table);
            };
            $fields = array_map( $fn, $fields );
        }
    

    (您确定让所有静态元素在您的设计中都有意义吗?)

    编辑:或另一个.....

    class Test {
        public static $fields   = array('parking' => array('parking_id', 'parking_country', 'parking_name'));
        public static $alias    = array();
    
        private static function SetAlias($value, $table){
            if(isset($table[$value]) === true){
                $value = $value.'` AS `'.$table[$value];
            }
            return($value);
        }
    
        protected static function getFieldMapper($table) {
            if( !isset(self::$alias[$table]) ) {
                return function($e) { return $e; };
            }
    
            $table = self::$alias[$table];
            return function($e) use ($table) {
                return Test::SetAlias($e, $table);
            };
        }
    
        public static function GetFields($table){
            $fields = array_map( self::getFieldMapper($table), self::$fields[$table]);
            return('`'.implode($fields, '`, `').'`');
        }
    }
    

    【讨论】:

    • 谢谢.. 这行得通。现在,如果我想在静态上下文中使用它,那就有很大的不同了。 (没想到会这样)
    • 您能否更改或改进:在问题文本中添加带有静态修饰符的类定义?
    • 完成。添加了上面的静态示例。
    • 为您的静态类添加了示例......仍然不确定这种设计是否有意义。但也许它确实......
    • Danke für deine Zeit!有用!谢谢!!是的,我知道。但这只是理解逻辑并在更大的整体中实现它的示例。
    猜你喜欢
    • 1970-01-01
    • 2012-01-06
    • 2013-07-29
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 2013-02-09
    相关资源
    最近更新 更多