繁体   English   中英

类中具有多个参数的PHP array_walk()

[英]PHP array_walk() in class with multiple arguments

美好的一天,

我遇到了以下问题。 我要在带有两个参数的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, '`, `').'`'); } } ?> 

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, '`, `').'`');
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM