2015-07-20 123 views
1

美好的一天,PHP array_walk()类中有多个参数

我得到了以下问题。 在我想要调用的类中有一个方法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); 
  • 警告:封闭:: 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'); 
?> 

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

回答

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

谢谢..这工作。现在,如果我想在静态环境中使用它,则会有很大的不同。 (我没有想到) –

+0

你可以请改变或更好:添加类定义与静态修饰符在你的问题文本? – VolkerK

+0

完成。添加了上面的静态示例。 –