2015-07-20 29 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

完成。添加了上面的靜態示例。 –