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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]